2017-02-26 95 views
0

我有一個python腳本。 主線程(如果名稱 =='主要'等):當主線程啓動時,它會運行多個線程來偵聽數據流,事件並處理它們。主線程然後開始運行Flask應用程序(app.run())。處理和數據發送到前端Flask應用程序(這裏沒有問題)Apache服務器上的多線程Flask應用程序

Apache服務器和mod_wsgi需要我直接導入應用程序,這意味着我的其他線程不會運行。

我的困境。在我見過的例子中,.wsgi腳本from someapp imports app as application。這隻會運行燒瓶應用程序。如果我設法以某種方式運行python腳本而不是main,那麼瓶型應用程序默認運行在localhost:5000上,建議不要在生產中更改或使用.run()。

首先,是否有可能在當前結構中的服務器上獲得此應用程序?我如何讓整個應用程序在服務器上工作?我需要徹底重組嗎?是不是可以指定主機:0.0.0.0端口:80然後運行python腳本,而不是隻導入應用程序?任何幫助表示讚賞,任何轉發到其他文件。

編輯:爲了測試的目的,我將使用AWS Ubuntu(如果需要,可以使用其他任何Linux發行版)。

回答

0

我設法找到一個答案,而不從導向發散太遠如何讓燒瓶中的應用與Python3和Apache2的工作。

總之,當你初始化瓶,你最有可能做這樣的事情:

from flask import Flask 
app = Flask(__name__)` 

提出的解決方案:

import atexit #for detecting flask exit 
import threading 
from flask import Flask 

shareddata = 0 
running = False 
def init_app(): 
    global shareddata 
    global running 
    running = True 
    app = Flask(__name__) 
    # some threading goes here 
    # e.g. 

    def jointhread(): 
     running=False 
     t.join() 

    def MyThread1(): 
     while(running): 
      #do something 

    t1 = threading.Thread(target=MyThread1, args=[]) 
    t1.start() 
    atexit.register(jointhread) 
    return app 

app = init_app() 

線程可能無法正常工作,無論是適用的。

1

排序和誤導性的答案是肯定的,它是可能的(確保沒有使用端口80,如Apache等任何其他程序):

if __name__ == '__main__': 
     app.run(host='0.0.0.0', port=80) 

但是,你不應該這樣做。不推薦,因爲它在文檔中指出:

您可以在開發過程中使用內置的服務器,但你應該使用 生產應用的全面部署選項。 (不要在生產中使用內置開發服務器 )。

通過apache2代理HTTP流量到Flask要好得多。

這樣,apache2就可以處理所有的靜態文件,並充當動態內容的反向代理,將這些請求傳遞給Flask。

要讓線程檢查WSGIDaemonProcess的documentation

阿帕奇/ mod_wsgi的配置的例子應該是這樣的:

WSGIDaemonProcess mysite processes=3 threads=2 display-name=mod_wsgi 
WSGIProcessGroup mysite 
WSGIScriptAlias//some/path/wsgi.py 
+0

我覺得有一個誤解。在我看到的所有示例和文檔中,在.wsgi文件中,它們都是「從某些應用程序導入應用程序的應用程序」。在我的情況下,someapp需要使用其他線程中存在的數據。如果我導入,我會不會創建它的一個實例,數據會丟失/它是無效的。 如果我運行了整個腳本,它只會默認在本地主機上顯示,並且像您所說的那樣,甚至不建議在生產中使用app.run()。 –

+0

只要確保您使用mod_wsgi守護進程模式並且不要設置「進程」選項。然後它將使用一個進程,所有線程仍然能夠看到相同的數據。 –

相關問題