flask - 无法配置 Gunicorn 来为同时运行另一个循环的 Flask 应用程序提供服务

标签 flask flask-sqlalchemy gunicorn python-multithreading

我有一个简单的 flask 应用程序,如下所示:

# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

我还有一个 Slack 机器人来读取消息

#bot.py
def serve(self):
    while True:
            message, channel = self.parse_slack_output(self.slack_client.rtm_read())
            if message and channel:
                self.handle_message(message, channel)
            time.sleep(self.READ_WEBSOCKET_DELAY)

我希望这两个代码同时运行。所以在 app.py 中我这样做:

#app.py
if __name__ == "__main__":
    import threading
    import bot

    flask_process = threading.Thread(target=app.run)
    bot_process = threading.Thread(target=bot.serve)
    bot_thread.start()
    flask_thread.start()

此代码与 $ python app.py 一起按预期工作,但是当我引入 gunicorn 时,机器人线程似乎无法工作。

我已经尝试过:

gunicorn app:app
gunicorn --workers=2 app:app
gunicorn --threads=2 app:app

我还尝试了multiprocessing库并得到了相同的结果。

知道如何解决这个问题吗?谢谢。

编辑:我现在明白这个问题是多么蹩脚了。我不应该在 if __name__ = "__main__": block 中编写代码。这不是 gunicorn 运行的。它直接选取应用程序并运行它。仍然需要弄清楚如何让它处理机器人线程。

最佳答案

我使用以下解决方案完成了这项工作:

# app.py
from flask import Flask
import threading
import bot

def create_app():
    app = Flask(__name__)
    bot_process = threading.Thread(target=bot.serve)
    return app

app = create_app()

@app.route('/')
def hello_world():
    return 'Hello, World!'

这可以确保 gunicorn --workers=1 app:app 在不同的线程中运行应用程序和机器人。虽然这有效,但此解决方案的一个缺点是我无法将工作人员数量扩大到 > 1。因为这不仅会扩大应用程序线程,还会扩大机器人线程,这是我不想要的。然后,机器人将不必要地监听两个线程中的消息。

您有更好的解决方案吗?请转达。谢谢。

关于flask - 无法配置 Gunicorn 来为同时运行另一个循环的 Flask 应用程序提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40529280/

相关文章:

python / flask : only one user can call a endpoint at one time

python - Flask:request.json 有效但 request.get_json() 导致错误代码 500

flask - SQLAlchemy-在模型字段上指定选项

python - 如何使用 SqlAlchemy_Utils ChoiceType 设置默认值

python - Flask - SQLAlchemy - 插入 GUID(BINARY(16)) 作为主键后出错

python - python如何在评论中产生错误?

python - SQLAlchemy - 一次搜索三个表

python - 运行时 Flask 中出现属性错误(AttributeError : 'NoneType' object has no attribute 'run' )

nginx - 为什么要使用带有反向代理的 gunicorn?

python - 获取 502 Bad Gateway 错误并使用 django、nginx、gunicorn 发送电子邮件