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

时间:2017-02-26 11:28:24

标签: python multithreading apache flask

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

3 个答案:

答案 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()