在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python/ python 為什么添加了睡眠1秒的時(shí)間代碼會(huì)影響多線程的執(zhí)行?

python 為什么添加了睡眠1秒的時(shí)間代碼會(huì)影響多線程的執(zhí)行?

直接上代碼:

import threading
import time
 
def worker(num):
    """
    thread worker function
    :return:
    """
    # time.sleep(1)
    # 當(dāng)我注釋掉休眠一秒的語(yǔ)句之后,才能夠正常顯示打印語(yǔ)句
    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的執(zhí)行如下圖:

clipboard.png

注釋掉之后如下圖:

clipboard.png

很好奇,這是什么原因?qū)е碌模壳蠼忉?,謝謝。

回答
編輯回答
亮瞎她

終端調(diào)試控制臺(tái)


更新

首先聲明在我的Ubuntu16.04,python3.5下面沒(méi)有你說(shuō)的這種情況,所以我猜懷疑你貼的圖片。
還有,提問(wèn)請(qǐng)把代碼貼正確,你代碼中有的標(biāo)點(diǎn)符號(hào)都是錯(cuò)的,沒(méi)有人想幫你改標(biāo)點(diǎn)錯(cuò)誤。

回答

為了重現(xiàn)你的問(wèn)題
我修改了一下:

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

原因

我顯式地設(shè)置了創(chuàng)建的線程為daemon,即你說(shuō)的守護(hù)線程,查看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.

當(dāng)所有的非daemon線程退出的時(shí)候python程序退出.而主線程是默認(rèn)非daemon
所以加不加sleep程序運(yùn)行結(jié)果應(yīng)該是一樣的。

至于你的結(jié)果和我的結(jié)果不一樣,我暫時(shí)只能歸結(jié)為各個(gè)平臺(tái)的實(shí)現(xiàn)不同了。

2018年9月1日 22:18
編輯回答
忘了我

因?yàn)樽泳€程休眠的時(shí)候,主線程已經(jīng)退出了,主線程退出后程序會(huì)結(jié)束,子線程都會(huì)退出,來(lái)不及執(zhí)行打印語(yǔ)句。
在主線程可以通過(guò)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() 
2017年12月28日 06:43