我有一个python脚本。 主线程(如果名称 =='主要'等):当主线程启动时,它会运行多个线程来侦听数据流,事件并处理它们。然后主线程开始运行Flask应用程序(app.run())。处理和数据被发送到前端Flask应用程序(这里没有问题)
Apache Server和mod_wsgi要求我直接导入应用程序,这意味着我的其他线程不会运行。
我的困境。在我看过的例子中,.wsgi脚本from someapp imports app as application
。这只会运行烧瓶应用程序。如果我设法以某种方式运行python脚本而不是main,那么烧瓶应用程序默认运行在localhost:5000上,不建议在生产中更改或使用.run()。
首先,是否可以在当前结构中的服务器上获取此应用程序?如何让整个应用程序在服务器上运行?我需要彻底重组吗?是不是可以指定host:0.0.0.0 port:80然后运行python脚本而不是只导入应用程序?任何帮助表示赞赏,任何转发到其他文件。
编辑:为了测试,我将使用AWS Ubuntu(如果需要,可以使用/切换任何其他Linux发行版)。
答案 0 :(得分:1)
排序和误导性答案是肯定的,有可能(确保有任何其他程序使用端口80,如apache等):
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
但是,你不应该这样做。不推荐,因为它在文档中说明:
您可以在开发期间使用内置服务器,但您应该使用 生产应用程序的完整部署选项。 (不要使用 生产中的内置开发服务器。)
通过apache2到Flask的代理HTTP流量要好得多。
这样,apache2可以处理所有静态文件,并充当动态内容的反向代理,将这些请求传递给Flask。
让线程检查WSGIDaemonProcess的documentation。
Apache / mod_wsgi配置的示例应如下所示:
WSGIDaemonProcess mysite processes=3 threads=2 display-name=mod_wsgi
WSGIProcessGroup mysite
WSGIScriptAlias / /some/path/wsgi.py
答案 1 :(得分:0)
我设法找到了一个答案,但没有偏离指南如何让Flask应用程序使用Python3和Apache2。
简而言之,当你初始化Flask时,你最有可能做到这样的事情:
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()
线程可能不起作用,无论哪个适用。
答案 2 :(得分:0)
我有一个类似的问题,其中有一个我想要使用API持续监控数据的线程。我最终将我想要的函数导入到我的WSGI文件中并将它们踢出去。
实施例
import threading
from main import <threaded_function>
my_thread = threading.Thread(target=<threaded_function>)
my_thread.start()