2016-11-10 4 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) 

I хотите, чтобы оба кода запускались одновременно. Таким образом, в 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. Так как это не только масштабирует поток приложений, но и поток ботов, который я не хочу. Затем бот будет излишне слушать сообщения в двух потоках.

Любое лучшее решение в вашем уме? передайте. Благодарю.