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