Python多线程下全局tasks更新后守护线程无法读取问题排查
为什么运行代码后无法得到"I get the source"的输出
问题核心是守护线程的运行机制+主线程提前退出,和全局变量可见性、OrderedDict线程安全性无关,代码执行时间线如下:
- 执行
init()时启动了设置daemon=True的test消费线程,线程启动后打印test runing进入循环:第一次检查tasks为空,随即执行time.sleep(1)进入休眠 - 主线程启动完消费线程后,执行
time.sleep(3)进入3秒休眠:这3秒内消费线程会被唤醒3次,每次检查tasks都为空,检查完立刻再次进入1秒休眠 - 主线程3秒休眠结束,调用
request()往tasks写入任务数据,这行代码执行完后,主线程没有剩余待执行代码,直接触发进程退出逻辑 - Python进程退出时不会等待守护线程执行完剩余逻辑,会直接终止所有守护线程回收资源。此时消费线程还处在1秒休眠状态,没来得及唤醒检查刚写入的
tasks,进程就已经结束,自然打印不出预期输出。
修复方案
可根据场景选择对应方案:
- 临时验证场景:直接在
request()调用后增加等待时长,给消费线程留足唤醒检查的窗口即可,示例修改:
init() time.sleep(3) request() # 新增2秒等待,等消费线程唤醒处理任务 time.sleep(2)
- 生产服务场景:不建议把核心任务消费线程设为守护线程,去掉
daemon=True参数,同时配合退出信号机制(比如threading.Event)控制消费线程生命周期,避免进程意外退出丢失任务。如果必须保留守护线程配置,要在主线程退出前增加线程同步逻辑,确认任务被消费后再退出。
内容的提问来源于stack exchange,提问作者周剑伟
相关产品推荐
相关产品推荐

