python - 为什么 Flask 应用程序在退出其 while 循环时仍在运行其线程?
问题描述
我正在编写一个 Flask 应用程序运行start=true
并停止在start=false
. 从日志中,我可以看到 while 循环在is_set()
返回 False 时停止,但在应用程序再次开始运行之后。我尝试了不同的方法,但到目前为止似乎都没有奏效。有人可以对此有所了解吗?
@app.route('/')
def index():
status = request.args.get('start', default=False, type=str)
flag = threading.Event()
if status == 'true':
flag.set()
else:
flag.clear()
t = threading.Thread(target=run, args=(flag,))
t.start()
t.join()
return status
def run(flag):
while flag.is_set() == True:
print('running')
time.sleep(1)
print('done')
这是打印的日志:
running
running
running
done
127.0.0.1 - - [27/Aug/2021 20:52:46] "GET /?start=false HTTP/1.1" 200 -
running
running
running
解决方案
flag
每次命中端点时,您都会创建一个新线程和一个新实例。这意味着flag
为后续请求清除的 不会影响先前请求的。
running #request 1
running #request 1
running #request 1
done #request 2
127.0.0.1 - - [27/Aug/2021 20:52:46] "GET /?start=false HTTP/1.1" 200 - #request 2
running #request 1
running #request 1
running #request 1
如果你想用 http 请求控制线程,线程和标志的创建应该在请求处理程序之外。
t = threading.Thread(target=run, args=(flag,))
t.start()
flag = threading.Event()
@app.route('/')
def index():
status = request.args.get('start', default=False, type=str)
if status == 'true':
flag.set()
if !t.is_alive():
t = threading.Thread(target=run, args=(flag,))
t.start()
else:
flag.clear()
return status
def run(flag):
while flag.is_set() == True:
print('running')
time.sleep(1)
print('done')
推荐阅读
- node.js - 异步等待结果
- python - 什么是查找具有所有常见元素的列表集的pythonic方法?
- javascript - Recreating aniamtion / side scroll slideshow
- javascript - Dropzone 脚本(仅限于 dropzone 和放置时的初始位置)
- angular - 错误 TS2709:不能使用命名空间“路由器”作为 Angular 11.2 中的类型
- xcode - 没有这样的模块“GoogleMobileAds”,框架路径错误
- opencv - 使用无人机摄像头进行对象跟踪
- wix - WiX:根据属性值在 RegistryKey 元素中设置 Root 属性
- c++ - 如何生成知道其类型的类的字段名称?
- flutter - InputDecoration 中 Flutter App 中的文本溢出