You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:36:25