gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:27:43 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com