无法配置Gunicorn以同时运行另一个循环的烧瓶应用程序

时间:2016-11-10 13:52:47

标签: flask flask-sqlalchemy gunicorn python-multithreading

我有一个简单的烧瓶应用程序,比如说:

# 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运行的内容。它直接拿起应用程序并运行它。还是要弄清楚如何让它处理机器人线程。

1 个答案:

答案 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.因为这不仅会扩展应用程序线程,还会扩展我不想要的机器人线程。然后机器人会在两个线程中不必要地监听消息。

你脑子里有更好的解决方案吗?请传达它。感谢。