python 为什么添加了睡眠1秒的时间代码会影响多线程的执行?

直接上代码:

import threading
import time
 
def worker(num):
    """
    thread worker function
    :return:
    """
    # time.sleep(1)
    # 当我注释掉休眠一秒的语句之后,才能够正常显示打印语句
    print("The num is  %d" % num)
    return
 
for i in range(20):
    t = threading.Thread(target=worker,args=(i,),name=“t.%d” % i)
    t.start()

如果不注释掉sleep这一行,IDE的执行如下图:

clipboard.png

注释掉之后如下图:

clipboard.png

很好奇,这是什么原因导致的?求解释,谢谢。

回复
阅读 4k
2 个回答

终端调试控制台


更新

首先声明在我的Ubuntu16.04,python3.5下面没有你说的这种情况,所以我猜怀疑你贴的图片。
还有,提问请把代码贴正确,你代码中有的标点符号都是错的,没有人想帮你改标点错误。

回答

为了重现你的问题
我修改了一下:

    t = threading.Thread(target=worker,args=(i,), name="t.%d" % i, daemon=True)

原因

我显式地设置了创建的线程为daemon,即你说的守护线程,查看threading文档可知

A thread can be flagged as a “daemon thread”. The significance of this flag is that the entire Python program exits when only daemon threads are left. The initial value is inherited from the creating thread.

所有的非daemon线程退出的时候python程序退出.而主线程是默认非daemon
所以加不加sleep程序运行结果应该是一样的。

至于你的结果和我的结果不一样,我暂时只能归结为各个平台的实现不同了。

因为子线程休眠的时候,主线程已经退出了,主线程退出后程序会结束,子线程都会退出,来不及执行打印语句。
在主线程可以通过thread.join方法等待所有子线程都退出。

task = []
for i in range(20):
    t = threading.Thread(target=worker, args=(i,), name="t.%d" % i)
    t.start()
    task.append(t)

for t in task:  #等待所有子线程都退出
    t.join() 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏