Python multiprocessing阻塞主线程 time.sleep引发输出异常问题
问题复现代码
import multiprocessing import time def do_something(name: str): while True: print(name) if __name__ == '__main__': p1 = multiprocessing.Process(target=do_something, args=(1,)) p1.start() p2 = multiprocessing.Process(target=do_something, args=(2,)) p2.start() while True: print(3) time.sleep(.1)
运行表现:
- 保留主线程的
time.sleep(.1)时,终端只大量输出1、2,主线程要打印的3完全不出现 - 删除主线程的
time.sleep(.1)后,1、2、3会交替输出,主线程打印逻辑恢复正常
核心原因
这不是multiprocessing.Process阻塞了主线程,本质是多进程共用标准输出流(stdout)时的锁竞争问题,和time.sleep的跨进程影响无关:
- Python的
print函数在输出内容时,需要先拿到stdout流的全局互斥锁,写完内容、刷新缓冲区后才会释放锁,同一时间只会有一个进程能拿到锁执行输出。 - 两个子进程的循环没有任何等待逻辑,会以最高频率持续抢占stdout锁:锁刚被上一个持有者释放,立刻就会被两个无等待的子进程抢到。
- 主线程每次循环要先休眠0.1秒才会尝试抢锁,等它休眠结束发起抢锁请求时,锁永远被子进程握在手里,根本拿不到执行输出的权限,看起来就像被阻塞了。
- 删除主线程的
sleep后,主线程也加入了无等待抢锁的队列,三个进程同优先级竞争锁,都有概率拿到锁,自然就能看到3的输出。
对照验证
你可以通过几个简单测试确认这个逻辑:
- 给两个子进程的
while循环里也加上time.sleep(.1),会看到1、2、3均匀交替输出,不会出现某类内容完全缺失的情况 - 把三个进程的输出分别定向到三个独立文件,不共用同一个stdout流,哪怕主线程保留0.1秒的sleep,3也会持续写入对应文件,主线程循环完全正常运行
- 把主线程的sleep时长改到0.001秒,你会看到3偶尔能打印出来,只是因为抢锁成功率低,出现频率远低于1和2
注意:
time.sleep只会让调用它的当前进程/线程进入休眠,不会跨进程干扰其他执行流,更不可能主动阻塞主线程。你如果在主线程print的前后加写独立文件的日志,会发现主线程的循环一直在正常跑,只是卡在print等锁的步骤而已。
内容的提问来源于stack exchange,提问作者Qlii256
相关产品推荐
相关产品推荐

