Gunicorn 不重新加载工人

Mos*_*ted 5 python wsgi web-worker gunicorn web

当其中一名工人无法启动时,我可以告诉 Gunicorn 失败吗?我不希望 Gunicorn 自动为我处理和重新加载工作程序,但我希望它失败,而不是一次又一次地尝试启动工作程序。我应该向主进程或某些信号提出任何特定的异常吗?或者我可以在启动主进程时提供命令行参数?我想在工作人员中实现像这样的逻辑:

if cond():
    sys.exit(1)
Run Code Online (Sandbox Code Playgroud)

然后所有的gunicorn都停下来而不重新启动这个工人

Mos*_*ted 4

所以,解决方案是使用Gunicorn hooks。它们有很多,但对于这种特殊情况,您可以使用worker_int钩子。使用示例可能如下(简化版本,使用 启动gunicorn app_module:app --config gunicorn_config.py),内容为gunicorn_config.py

import sys

workers = 1
loglevel = 'debug'

def worker_int(worker):
    print('Exit because of worker failure')
    sys.exit(1)
Run Code Online (Sandbox Code Playgroud)

例如,您的工作代码可能是一个简单的 Flask 应用程序(内容为app_module.py

from flask import Flask

app = Flask()
Run Code Online (Sandbox Code Playgroud)

其他有用的钩子:

  • on_exit - 退出 Gunicorn 之前
  • pre_request - 在工作人员处理请求之前
  • on_starting - 在主进程初始化之前

就是这样!