我有一个简单的烧瓶应用程序,比如说:
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
我还有一个松散的机器人阅读消息
#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__":
块中编写代码。这不是gunicorn
运行的内容。它直接拿起应用程序并运行它。还是要弄清楚如何让它处理机器人线程。
答案 0 :(得分:2)
我使用以下解决方案完成了这项工作:
# 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
在不同的线程中同时运行app和bot。虽然这有效,但这个解决方案的一个缺点是我无法将工人数量扩大到> 1.因为这不仅会扩展应用程序线程,还会扩展我不想要的机器人线程。然后机器人会在两个线程中不必要地监听消息。
你脑子里有更好的解决方案吗?请传达它。感谢。