在Flask中的新线程中启动无限python脚本

时间:2016-09-16 18:23:52

标签: python multithreading flask process daemon

我想从Flask请求中开始我永无止境的Python脚本:

def start_process():
    exec(open("./process/main.py").read(), globals())
    print("Started")
    return

以及请求:

@app.route("/start")
   def start():
   from threading import Thread
   thread = Thread(target=start_process, args=())
   thread.setDaemon(True)
   thread.start()
   return redirect(url_for('main'))

main.py进程是一个等待一些消息的小测试服务器,但它只是挂起整个烧录脚本(事实上,通过gunicorn,如果我发送CTRL-C,我可以看到输出子)。

如何让main.py脚本单独启动?

1 个答案:

答案 0 :(得分:1)

我没有成功地从Flask内部开始长时间运行的线程,但是已经走了另一条路:在线程中启动Flask并为其提供与其他线程通信的方式。

诀窍在于

def webserver(coordinator):
    app.config['COORDINATOR'] = coordinator
    app.run(use_reloader=False)
    # use_reloader=False is needed to keep Flask happy in a thread

def main():
    coordinator = Coordinator()
    ui = threading.Thread(target=webserver, args=(coordinator,))
    ui.start()
    # start other threads, passing them coordinator
    # start long-running tasks in main thread, passing it coordinator

Coordinator使用threading工具(例如LockQueue)来保护对共享数据或资源的访问权限。您可以相当轻松地设置协调器以支持工作线程阻塞,直到发出信号(来自处理程序),然后启动长时间运行的任务。