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()
修改后的效果
这样两个线程会同时启动:
- 第一个线程输出5,然后进入
time.sleep(5)——这时候Python会释放GIL,允许其他线程执行 - 第二个线程立刻开始输出8、9、10
- 5秒后第一个线程从sleep中恢复,继续输出6、7
最终输出就会符合你的预期,类似5,8,9,10,6,7(线程调度可能有细微差异,但大体顺序一致)。
内容的提问来源于stack exchange,提问作者Glen D souza
相关产品推荐
相关产品推荐

