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

Python线程疑问:sleep时未切换线程?如何修改代码实现预期输出

为什么Python线程调用sleep时没有切换?怎么修改代码实现预期输出?

嘿,我一眼就发现问题所在了——你错误地提前执行了函数,而不是把函数交给线程去执行,根本没真正开启多线程模式!

问题出在哪?

看你创建线程的代码:

threading.Thread(merge_array1([5, 6, 7])).start()
threading.Thread(merge_array2([8,9,10])).start()

当Python执行这两行代码时,会先调用merge_array1([5,6,7]),把这个函数的返回值(你的函数没有return,所以是None)传给threading.Thread的构造参数。这意味着:

  • merge_array1是在主线程里直接跑完的,输出5、6、7(中间sleep5秒)
  • 然后才创建了一个什么都不做的线程(因为target是None)并启动
  • 接着主线程又直接执行merge_array2([8,9,10]),输出8、9、10
  • 再创建另一个空线程启动

整个过程完全是主线程的顺序执行,根本没用到多线程,自然不会出现你预期的线程切换效果。

怎么修改代码?

正确的线程创建方式是:用target参数指定要执行的函数对象,用args参数传递函数的参数(注意是元组格式)。修改后的代码如下:

import threading
import time

def merge_array1(a1):
    for x in a1:
        print(x)
        time.sleep(5)

def merge_array2(a1):
    for x in a1:
        print(x)

def run():
    # 正确指定target和args
    threading.Thread(target=merge_array1, args=([5, 6, 7],)).start()
    threading.Thread(target=merge_array2, args=([8,9,10],)).start()

run()

修改后的效果

这样两个线程会同时启动:

  1. 第一个线程输出5,然后进入time.sleep(5)——这时候Python会释放GIL,允许其他线程执行
  2. 第二个线程立刻开始输出8、9、10
  3. 5秒后第一个线程从sleep中恢复,继续输出6、7

最终输出就会符合你的预期,类似5,8,9,10,6,7(线程调度可能有细微差异,但大体顺序一致)。

内容的提问来源于stack exchange,提问作者Glen D souza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:59:44