Python多线程并发调用print()的实际运行机制是怎样的?
Python多线程下print输出异常的原因
print()函数向控制台输出的操作默认拆分为两个独立步骤:
- 写入你传入的打印内容(比如示例中的
y/x字符) - 自动追加写入换行符
\n
这两步不属于原子操作,执行过程中可以被操作系统的线程调度打断,让其他线程先执行。
第一段无sleep的代码输出yx的原因
两个线程几乎同时启动:
- 线程y先拿到执行权,调用
print("y")刚写完字符y,还没来得及写入对应的换行符,就被操作系统切换走,让出了执行权 - 线程x此时抢到执行权,调用
print("x")先写入了字符x,之后两个线程再各自执行剩下的写换行符操作,最终两个字符就拼接在了同一行,输出yx。
第二段加sleep的代码正常换行的原因
启动y线程后加的0.001秒延迟,足够让y线程的print()两步操作全部执行完成(写完y和对应换行符),之后x线程才会启动执行自己的打印逻辑,所以输出就是各自独占一行的格式。
避免多线程打印混乱的方案
要保证多线程下每次打印的内容和换行绑定不被拆分,可以用两种方案:
- 自定义线程锁,所有打印操作执行前先获取锁,执行完成后释放锁,保证每次只有一个线程在执行打印逻辑
- Python 3.3及以上版本可以给
print()加flush=True参数,能降低输出混乱的概率,不过最稳妥的方案还是加锁。
内容的提问来源于stack exchange,提问作者SlimeyGuy123
相关产品推荐
相关产品推荐

