Apache服务器上的多线程Flask应用程序

问题描述:

我有一个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发行版)。

我设法找到一个答案,而不从导向发散太远如何让烧瓶中的应用与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() 

线程可能无法正常工作,无论是适用的。

排序和误导性的答案是肯定的,它是可能的(确保没有使用端口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守护进程模式并且不要设置“进程”选项。然后它将使用一个进程,所有线程仍然能够看到相同的数据。 –