【问题标题】:Start infinite python script in new thread within Flask在 Flask 的新线程中启动无限 python 脚本
【发布时间】:2016-09-16 18:23:51
【问题描述】:

我想从 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进程是一个小测试服务器,它等待一些消息,但它只是简单地挂起整个flask脚本(实际上,通过gunicorn,如果我发送CTRL-C,我可以看到子进程的输出) .

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

【问题讨论】:

    标签: python multithreading flask process daemon


    【解决方案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)来保护对共享数据或资源的访问。您可以相当轻松地设置协调器以支持让工作线程阻塞直到发出信号(来自处理程序),然后开始长时间运行的任务。

    【讨论】:

    • 它与我想做的相反,但它始终是一种解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多