我想知道在 Flask 中結束執行緒作業是否需要做一些特別的事情?這是示例代碼:
from flask import (
Flask, jsonify, render_template, request
)
import threading
import time
import random
app = Flask(__name__)
def task(thread_return):
random_seconds=random.random()
print(f'Start task {threading.current_thread().name} ')
time.sleep(random_seconds*15)
print(f'completed {threading.current_thread().name} ')
thread_return['seconds']= random_seconds*5
thread_return = {'seconds': 0}
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "GET":
return render_template("index-ajax.html")
val = request.json.get("c_check")
t =threading.Thread(target=task, args=(thread_return,), daemon=True)
if val==1:
print("val1 is ", val)
t.start()
elif val==0:
try:
print('trying to kill thread')
exit_event= threading.Event()
exit_event.set()
except Exception as e:
print(e)
print("val0 is ", val)
return jsonify({"data": {"val": val}})
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000, debug=True)
我已經嘗試合并我在網上看到的幾個將任務函式包裝在一個類中的示例,但它不起作用,即: 退出執行緒優雅地
我喜歡另一個例子,但我也無法讓它與 Flask 一起作業: 你如何殺死 Python 執行緒
感謝您的幫助。
uj5u.com熱心網友回復:
我正在嘗試多次重寫并注意到以下作業。顯然,我需要
- 在路由函式之外宣告 threading.event()
- 在任務函式中設定 exit_event.set() 來結束任務或阻止任務運行
- 并修改任務函式以更好地模擬長時間或無限期運行的任務
也許其他人有更優雅的pythonic解決方案。
from flask import (
Flask, jsonify, render_template, request
)
import threading
import time
import random
app = Flask(__name__)
def task(thread_return):
i=0
while True:
if exit_event.is_set():
print(f'end {threading.current_thread().name} ')
return
i =1
random_seconds=random.random()
print(f'Running task {threading.current_thread().name} {i} sec elapsed')
time.sleep(1)
exit_event= threading.Event()
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "GET":
return render_template("index-ajax.html")
val = request.json.get("c_check")
exit_event.clear()
t =threading.Thread(target=task, args=(thread_return,), daemon=True)
if val==1:
print("val1 is ", val)
t.start()
elif val==0:
try:
print('trying to end thread')
exit_event.set()
except Exception as e:
print(e)
print("val0 is ", val)
return jsonify({"data": {"val": val}})
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000, debug=True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/377673.html
標籤:Python 烧瓶 python-多线程
上一篇:groupby子句燒瓶煉金術
下一篇:使用函式從陣列中洗掉專案
