我想从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
脚本单独启动?
答案 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
工具(例如Lock
,Queue
)来保护对共享数据或资源的访问权限。您可以相当轻松地设置协调器以支持工作线程阻塞,直到发出信号(来自处理程序),然后启动长时间运行的任务。