Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何让Flask网页(路由)在另一个网页(路由)上运行时在后台运行_Python_Multithreading_Flask_Websocket - Fatal编程技术网

Python 如何让Flask网页(路由)在另一个网页(路由)上运行时在后台运行

Python 如何让Flask网页(路由)在另一个网页(路由)上运行时在后台运行,python,multithreading,flask,websocket,Python,Multithreading,Flask,Websocket,所以我正在创建这个应用程序,其中一部分是一个网页,其中一个交易算法正在使用实时数据进行自我测试。所有这些都在工作,但问题是如果我离开(退出)网页,它就会停止。我想知道如何让它在后台无限期地运行,因为我想让算法继续做它的事情 这是我想在后台运行的路线 @app.route('/live-data-source') def live_data_source(): def get_live_data(): live_options = lo.Options()

所以我正在创建这个应用程序,其中一部分是一个网页,其中一个交易算法正在使用实时数据进行自我测试。所有这些都在工作,但问题是如果我离开(退出)网页,它就会停止。我想知道如何让它在后台无限期地运行,因为我想让算法继续做它的事情

这是我想在后台运行的路线

@app.route('/live-data-source')
def live_data_source():
    def get_live_data():
        live_options = lo.Options()
        while True:
            live_options.run()
            live_options.update_strategy()
            trades = live_options.get_all_option_trades()
            trades = trades[0]
            json_data = json.dumps(
                {'data': trades})
            yield f"data:{json_data}\n\n"
            time.sleep(5)

    return Response(get_live_data(), mimetype='text/event-stream')

我研究过多线程,但不太确定这是否适合这项工作。我对烧瓶还是个新手,所以这个问题很糟糕。如果您需要更多信息,请发表评论。

您可以通过以下方式进行操作-这是下面100%的工作示例。请注意,在生产中使用芹菜完成此类任务,或者自己编写另一个守护程序应用程序(另一个进程),并在消息队列(例如RabbitMQ)或公共数据库的帮助下从http服务器向其提供任务

如果您对下面的代码有任何疑问,请随时提问,这对我来说是一个很好的练习:

从烧瓶导入烧瓶,当前应用程序
导入线程
从线程导入线程,事件
导入时间
从随机导入randint
app=烧瓶(名称)
#使用dict存储事件以停止其他踏板
#每个线程一个事件!
app.config[“ThreadWorkerActive”]=dict()
def do_工作(e:事件):
“”“只为另一个线程执行某些工作而运行的函数”“”
尽管如此:
如果e.已设置():
break#可以从另一个trhead停止
打印(f“{threading.current_thread().getName()}正在工作…”)
时间。睡眠(2)
打印(f“{threading.current_thread().getName()}已停止…”)
@app.route(“/long_-thread”,方法=[“GET”])
def long_thread_task():
“”“允许启动新线程”“”
th_name=f“th-{randint(100000,999999)}”#实际上并不是唯一的
stop_event=event()#用于停止另一个线程
th=Thread(target=do\u work,args=(stop\u event,),name=th\u name,daemon=True)
th.start()
当前\u app.config[“ThreadWorkerActive”][th\u name]=停止\u事件
返回f“{th_name}已创建!”
@app.route(“/stop\u thread/”,方法=[“GET”])
def停止线程任务(th_id):
th_name=f“th-{th_id}”
如果当前应用程序配置[“ThreadWorkerActive”].keys()中的名称:
e=当前应用程序配置[“ThreadWorkerActive”].get(th_名称)
如果e:
e、 集合()
当前应用程序配置[“ThreadWorkerActive”].pop(th_名称)
返回f“Th-{Th_id}被要求停止”
其他:
return“对不起,出了问题…”
其他:
返回f“未找到Th-{Th_id}”
@app.route(“/”,methods=[“GET”])
def index_route():
text=(“/long\u thread-创建另一个线程。”
“/stop_thread/th_id-使用特定id停止线程。”
f“可用线程:{';'.join(当前_app.config['ThreadWorkerActive'].keys())}”)
返回文本
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
应用程序运行(主机=“0.0.0.0”,端口=9999)

您好,有什么反馈吗?这正是我想要的。感谢您的帮助和描述性代码!