Python threading示例代码在不同运行环境输出不一致问题咨询
Python多线程代码跨环境输出差异原因解析
现象说明
同一段threading相关代码在不同运行环境得到完全不同的输出:
- 本地IDLE运行输出:
hey3 >>> run
- 理论预期输出:
hey 2 run
相关代码
import threading import time def demo_func(): print("hey") time.sleep(1) print("run") t1 = threading.Thread(target = demo_func) t1.start() print(threading.activeCount())
差异原因
- 线程调度顺序不确定性:CPU调度子线程和主线程的顺序没有固定规则,完全由操作系统和Python解释器的调度策略决定,没有同步锁的前提下两个线程的执行顺序不可控。
- print缓冲机制差异:print默认是行缓冲模式,只有输出内容带换行符、缓冲区满或者程序退出时才会把缓冲区内容输出到终端,不同运行环境的缓冲刷新策略不同。IDLE环境下子线程执行
print("hey")输出的内容没有立刻刷新缓冲区,紧接着主线程抢到执行权输出activeCount的结果,两个内容合并刷新就出现了hey3的拼接输出。 - IDLE额外后台线程:你预期activeCount返回2(主线程+自定义t1线程),但IDLE本身会启动额外的守护线程处理交互补全、命令响应等逻辑,所以实际活跃线程数是3,和预期不符。
- 主线程先于子线程退出:主线程在启动t1之后没有等待子线程执行完成,直接输出activeCount后就结束运行,IDLE的交互提示符
>>>会立刻弹出,子线程sleep 1秒后才输出run,所以run会出现在提示符后面。
调整方案
如果要得到稳定的预期输出,可以做两处修改:
- 所有print语句增加
flush=True参数,强制立刻刷新输出缓冲区,避免内容拼接 - 主线程最后调用
t1.join(),等待子线程执行完成后再结束,避免提示符提前弹出
修改后代码参考:
import threading import time def demo_func(): print("hey", flush=True) time.sleep(1) print("run", flush=True) t1 = threading.Thread(target = demo_func) t1.start() print(threading.activeCount(), flush=True) t1.join()
内容的提问来源于stack exchange,提问作者Vaibhav Yadav
相关产品推荐
相关产品推荐

