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
我觉得有一个误解。在我看到的所有示例和文档中,在.wsgi文件中,它们都是“从某些应用程序导入应用程序的应用程序”。在我的情况下,someapp需要使用其他线程中存在的数据。如果我导入,我会不会创建它的一个实例,数据会丢失/它是无效的。 如果我运行了整个脚本,它只会默认在本地主机上显示,并且像您所说的那样,甚至不建议在生产中使用app.run()。 –
只要确保您使用mod_wsgi守护进程模式并且不要设置“进程”选项。然后它将使用一个进程,所有线程仍然能够看到相同的数据。 –