【问题标题】:Falcon/gunicorn code initialization (run once) with multiple workers (singleton?)Falcon/gunicorn 代码初始化(运行一次)与多个工作人员(单例?)
【发布时间】:2019-01-07 05:42:44
【问题描述】:

我在 docker 中使用 Falcon 1.4.1 和 Gunicorn 19.9.0。

无法确定初始化应用程序的最佳方式 - 在我的 REST API 启动时运行一些代码,而不是每个工作人员运行一次。我有 3 名或更多工作人员正在为我的应用程序运行。

我已经尝试使用 gunicorn on_starting webhook,但它仍然为每个工作人员运行一次。在我的 gunicorn_conf.py 文件中:

def on_starting(server):
    print('Here I am')

我还尝试了 gunicorn preload_app 设置,我现在很乐意在生产环境中使用它,它允许应用程序初始化在启动工作程序之前运行一次。

我希望能够使用 gunicorn reload 设置,以便文件更改重新启动与 preload_app 设置直接冲突的应用程序。

可能只是想要太多:) 有人对解决方案有任何想法吗?我看到一些尝试通过多处理获取锁定文件,但结果你得到了一个锁定文件/工作者。

【问题讨论】:

  • 如果你对preload_app的问题只是在开发过程中,你能不能不只使用一个工人,而只在生产中切换到多个工人?
  • 试过了,但我已经设置了它,以便 API 调用 API 并锁定,因为当前进程在仅使用一名工作人员调用 API 时被阻止。可能有更好的处理方式,但我正在尝试创建一个为 API 提供支持的库,它可以单独使用,并尽量保持 DRY。

标签: python-3.x gunicorn falconframework


【解决方案1】:

我无法正确理解您到底想要达到什么目的?如果您也发布错误代码会有所帮助。

正如您所提到的,您可以使用 Gunicorn preload_app 设置而不是为所有工作人员运行一次代码。

现在您可以使用以下代码在文件更改时重新加载 Gunicorn 实例:

gunicorn --workers 3 -b localhost:5000 main:app --reload

如果这不是您要查找的内容,请在此处分享错误代码,因为您提到“我看到一些尝试通过多处理获取锁定文件,但结果您得到了一个锁定文件/工作者。”我会尽力帮助你。

【讨论】:

  • 使用 --reload 选项与 preload_app 设置不兼容。 preload_app 设置运行我的设置代码一次。 --reload 设置为我正在运行的每个 gunicorn worker(4 个或更多)运行一次我的设置/初始化代码。我还没有想出一个健壮的方法来运行我的初始化代码一次而不使用 preload_app 这使开发变得痛苦(每次我有机会都必须重新启动 gunicorn 服务器)。感谢您查看此内容!
  • 这是我在尝试为 gunicorn 使用多处理锁时看到的问题:stackoverflow.com/questions/18213619/… 不使用预加载 - 锁在工作人员之间不共享。
猜你喜欢
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 2016-04-22
  • 2015-03-12
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多