为何带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
相关产品推荐
相关产品推荐

