禁用mod_wsgi为Flask脚本启动新线程

时间:2017-09-03 11:11:34

标签: python multithreading apache flask mod-wsgi

我正在设置RPI3来控制/测量外部电子设备。它使用Apache2服务器和运行Flask的mod_wsgi。控件的所有代码都在一个名为 Timer 的单独类中,该类在__init__.py Flask脚本中初始化。控件的主循环位于不同的线程上。

无法在文档中找到此功能,但从体验看,只要服务器稀疏地获取请求,服务器就会在相同的__init__.py上运行。如果脚本在新请求到来时忙,则服务器在单独的线程上启动新的请求。发生这种情况时, Timer 类的原始实例“在内存中丢失”,因为从那里处理请求的当前脚本不知道它。

我的解决方案很长一段时间将有关正在运行的对象的所有信息写入json文件,并设置了 Timer 类和__init__.py来读取/写入它。在我看来,这有点狡猾。当然这已经解决了。

所以我想做这两件事中的任何一件:

  • 禁用此功能,因此无论如何,相同的脚本始终处理请求。 (这似乎会产生很多错误)
  • (首选)访问内存中的“丢失”对象(以及运行测量的线程),并直接从新线程上的脚本控制它。

这些可能吗?

这是简化的代码。

from flask import Flask, render_template, request
import time
import threading

class Timer:
    def __init__(self):
        #setup variables
        pass

    def mainloop(self):
        while True:
            data = readSensor()
            writeFile(data)
            time.sleep(5)


app = Flask(__name__)

t = Timer()

@app.route('/', methods=['GET', 'POST'])
def homepage():
    if request.method == 'POST':
        return render_template("main.html")
    elif request.method == 'GET':
        return render_template("main.html")


@app.route('/_submit')
def submit():
    t = threading.Thread(target=t.mainloop)
    t.start

if __name__ == "__main__":
    app.run()

1 个答案:

答案 0 :(得分:0)

您应该尝试

中讨论的方法

Python, WSGI, multiprocessing and shared data

基本上,您需要跨线程/进程共享数据