2016-11-10 59 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會不必要地在兩個線程中偵聽消息。

你心中有什麼更好的解決方案?請轉達。謝謝。