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

为何带sleep的Python多线程输出无序,移除sleep则输出固定?

线程执行顺序差异的原因解析

问题场景

使用Python的threading模块创建10个线程,当work函数中加入time.sleep(1)时,线程输出顺序每次都不同;移除sleep后,输出顺序完全一致。

代码示例

import threading
import time


def work():
    time.sleep(1)
    print(f"{threading.current_thread().name} - work......")


if __name__ == '__main__':
    for i in range(10):
        t = threading.Thread(target=work)
        t.start()

带time.sleep(1)的输出情况

第一次输出:

Thread-1 - work......
Thread-2 - work......
Thread-3 - work......
Thread-4 - work......
Thread-5 - work......
Thread-6 - work......
Thread-9 - work......
Thread-10 - work......
Thread-7 - work......
Thread-8 - work......

Process finished with exit code 0

第二次输出:

Thread-1 - work......
Thread-2 - work......
Thread-3 - work......
Thread-5 - work......
Thread-7 - work......
Thread-9 - work......
Thread-6 - work......
Thread-8 - work......
Thread-10 - work......
Thread-4 - work......

Process finished with exit code 0

移除time.sleep(1)的输出情况

Thread-1 - work......
Thread-2 - work......
Thread-3 - work......
Thread-4 - work......
Thread-5 - work......
Thread-6 - work......
Thread-7 - work......
Thread-8 - work......
Thread-9 - work......
Thread-10 - work......

Process finished with exit code 0

原因解析

1. 移除sleep时的有序输出

当work函数中没有sleep语句时,线程启动后会立即执行print操作——这个任务的执行时间极短,短到操作系统的线程调度器还没来得及将当前线程挂起、切换到其他线程,该线程就已经完成了print并退出。
我们按顺序启动Thread-1到Thread-10,每个线程都在被调度器打断前就完成了任务,所以输出顺序和线程启动顺序完全一致,且每次运行结果都相同。

2. 加入sleep时的无序输出

time.sleep(1)会让当前线程主动释放CPU时间片,进入休眠状态,此时操作系统会从就绪队列中随机挑选其他线程来执行。1秒后,所有休眠的线程都会被唤醒,进入就绪状态等待调度。
由于操作系统的线程调度是随机且受系统实时状态影响的(比如当前CPU负载、其他进程的运行情况等),每次调度器选择执行的线程顺序都不固定,因此最终的print输出顺序就会每次都不一样。


内容的提问来源于stack exchange,提问作者haojie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:53:12