Flask线程内while True无法返回结果?原deque跨线程问题修正
线程间共享列表结构数据的问题解决
嘿,我来帮你拆解下你遇到的问题,顺便把测试代码的坑填上~
1. 测试代码空deque的问题修复
你当前的测试代码其实漏了两个关键的模块导入,这直接导致代码没法正常运行,自然打印不出更新后的deque。先看修正后的完整代码:
from collections import deque import datetime import threading # 之前没导入这个模块,线程根本启动不了! import time # 同样漏了time模块,sleep会直接报错 values = deque() def addValues(values): while True: found = 1 now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') values.append((found,now)) time.sleep(5) t1 = threading.Thread(target=addValues, args=(values,)) t1.start() while True: # 把deque转成list打印,能更清晰看到里面的元素 print("当前存储的内容:", list(values)) time.sleep(5)
运行这段代码后,你就能看到主循环每隔5秒打印出包含新增元素的内容了。原因很简单:deque在CPython里的append操作是原子性的,天生线程安全,主线程和子线程可以直接共享这个对象,之前的空输出完全是因为代码缺少必要导入,根本没正常跑起来😂
2. 线程间数据共享的选型建议
- 如果你只需要简单的“追加+读取”列表式共享,
deque确实是个轻量好用的选择,它的核心操作都是线程安全的,不用额外加锁 - 要是你需要更严谨的同步逻辑(比如等待数据到来、限制队列大小),
queue.Queue其实也能满足批量获取的需求,比如在主线程里循环取元素:from queue import Queue import datetime import threading import time q = Queue(maxsize=10) # 子线程里持续put数据 def add_to_queue(): while True: q.put(("data", datetime.datetime.now())) time.sleep(5) # 主线程里批量读取 threading.Thread(target=add_to_queue).start() while True: while not q.empty(): print(q.get()) time.sleep(5)
3. Flask项目的特殊问题
你提到实际是Flask项目里用while True的线程会导致无法返回结果,这个确实是个单独的场景问题——Flask的请求响应模型是短周期的,后台无限循环线程可能会和Flask的上下文、请求处理逻辑冲突,建议你单独提问这个场景的细节(比如线程是在请求里启动的还是全局启动的、具体要实现什么业务),这样能更精准地给出解决方案。
内容的提问来源于stack exchange,提问作者Joost Luijben
相关产品推荐
相关产品推荐

