python - 如何在 Procfile 中运行两个进程?

标签 python heroku flask bokeh procfile

我有一个 Flask 应用程序,我在其中嵌入了 Bokeh 服务器图,但我无法让它们同时在 Heroku 上工作。我正在尝试在 Heorku 上部署,我可以从 Procfile 启动 Bokeh 应用程序或 Flask 应用程序,但不能同时启动两者。因此,要么显示 Flask 提供的内容,要么显示 Bokeh 图。

当我在 Procfile 中使用以下行进行部署时,Bokeh 内容显示在网页上,但 Flask 中没有显示任何内容:

web: bokeh serve --port=$PORT --host=bokehapp.herokuapp.com --host=* --address=0.0.0.0 --use-xheaders bokeh_script.py

如果我使用以下内容进行部署,我只会得到 Flask 内容,而不是 Bokeh 图表:

web: gunicorn app:app

在第二种情况下,我使用子进程在 app.py Flask 脚本中启动 Bokeh:

bokeh_process = subprocess.Popen(
    ['bokeh', 'serve','--allow-websocket-origin=bokehapp.herokuapp.com','--log-level=debug','standard_way_with_curdoc.py'], stdout=subprocess.PIPE)

Heroku 日志没有显示任何错误。

我还尝试了第三种选择:

web: bokeh serve --port=$PORT --host=bokehapp.herokuapp.com --host=* --address=0.0.0.0 --use-xheaders bokeh_script.py
web: gunicorn app:app

那只显示 Flask 内容。似乎只考虑了第二个 worker 。

那么,我的问题是如何修改 Procfile 以考虑这两个进程? 或者也许我一起接近这个错误?您能提供的任何线索将不胜感激。

最佳答案

每个 Heroku dyno 都分配了一个公共(public)网络端口,您可以从 $PORT 中获取。变量,在启动您的应用程序之前由 Heroku 预先分配。不幸的是,您只能在 dyno 中运行一个公共(public) Web 服务器。

我认为您需要做的第一件事是通过您的 Flask 服务器将所有请求路由到您的应用程序。例如,您可以添加 /bokeh/<path:path>使用 requests 路由到您的 Flask 应用程序,将所有请求转发到 Bokeh 服务器,然后将响应发送回客户端。通过此更改,您现在拥有一个公共(public) Web 服务器,并且 bokeh 服务器可以作为后台服务运行而无需公共(public)访问。

现在您可以将 Flask 应用程序部署到 Heroku,并让它接收自己的请求和对 bokeh 服务器的请求。下一步是找出部署 Bokeh 服务器的位置。

执行此操作的正确方法是在单独的测功机上部署 Bokeh 。 Flask dyno 将知道如何将请求转发到 bokeh,因为您将拥有一个带有 bokeh 服务器 URL 的配置项。

如果您想将所有内容都托管在一个测功机上,我认为您也可以,尽管我自己从未尝试过,也无法确认它是否可行。一体式配置不太理想,不是 Heroku 推荐的配置,但根据 dyno networking documentation看来您可以私下监听除$PORT 之外的任何网络端口.这些没有公开,但文档似乎暗示在 dyno 中运行的进程可以通过私有(private)端口进行通信。例如,您可以在 $PORT 上启动 Flask 应用程序,以及 $PORT + 1 上的 Bokeh 服务器,并让 Flask 在内部将所有 Bokeh 请求转发到 $PORT + 1 .

关于python - 如何在 Procfile 中运行两个进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641568/

相关文章:

node.js - 推送到 Heroku 失败 - 错误 fsevents@0.2.0 安装 : `node-gyp rebuild`

python - 从 python 中的 numpy 矩阵计算这两个元素对的两个元素的单独频率

python - 使用 OpenCV 删除部分图像

postgresql - 在 Heroku Postgres 上管理独立数据库的可编程方式

mysql - Ruby on Rails - 无法加载此类文件 -- mysql2/2.2/mysql2 (LoadError)

python - oauth2回调时如何恢复flask.session对象

python - Flask:带有可变参数的 URL

python - SQLAlchemy 多表连接

用于评估庞大数据集平均值的 Pythonic 方法

python - 如何使用 matplotlib 将半极坐标图设置为北