2016-11-10 65 views
2

我有一个简单的瓶的应用程序,这样说:无法配置Gunicorn服务烧瓶中的应用程序运行的另一个回路同时

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

回答

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同时运行的应用程序,并在不同的线程机器人。虽然这可行,但这种解决方案的一个缺点是我无法将工作人员的数量扩大到大于1.因为这不仅会缩放应用程序线程,还会缩小我不想要的bot线程。然后bot会不必要地在两个线程中侦听消息。

你心中有什么更好的解决方案?请转达。谢谢。