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

鍍金池/ 問答/Python/ python 多線程threading setDeamon()和join()可以

python 多線程threading setDeamon()和join()可以只用其一嗎?

看了很多文檔,感覺大家寫的互相都有些矛盾。

我現(xiàn)在假如要實(shí)現(xiàn)這樣的需求:

主線程不等待子線程,但是主線程結(jié)束時(shí),子線程仍能繼續(xù)單獨(dú)運(yùn)行。

這種情況下,我試了下,似乎 setDeamon 設(shè)為為 False, 不加 join() 就可以滿足。是這樣嗎?

然后拋開這個(gè)需求不說,如果加了 join(), 寫不寫 setDeamon() 或者 setDeamonTrueFalse
并沒有什么影響,都是等主線程等待子線程結(jié)束才執(zhí)行,但我看網(wǎng)上很多文檔都是 setDeamonjoin 一起用的,不懂這樣用的好處在哪里?

回答
編輯回答
陌璃

你得考慮意外退出的情況,比如ctrl-c

2018年9月10日 17:53
編輯回答
臭榴蓮

先看看題主的需求

主線程不等待子線程,但是主線程結(jié)束時(shí),子線程仍能繼續(xù)單獨(dú)運(yùn)行。

這個(gè)需求弄不了,因?yàn)橹骶€程退出后,所有子線程都會(huì)結(jié)束,與有沒有設(shè)置 setDeamon 無關(guān),當(dāng)主線程結(jié)束后,python將銷毀運(yùn)行時(shí)環(huán)境。

setDeamon 在這其中會(huì)有一點(diǎn)點(diǎn)區(qū)別,如果 setDaemon(False) ,主線程將等待該線程結(jié)束,等同于你調(diào)用線程的 join 方法。如果 setDaemon(True) ,那么和之前一樣,主線程結(jié)束,所有子線程都將結(jié)束,不會(huì)等待子線程運(yùn)行結(jié)束。

------- 分割線 -------
被踩了??? ?。?哪說錯(cuò)了啊。主線程將等待該線程結(jié)束,所有子線程都會(huì)退出的啊,翻源碼來說明,好氣啊。
代碼在 Lib/threading.py 中:

_main_thread = _MainThread()

def _shutdown():
    assert tlock is not None
    assert tlock.locked()
    tlock.release()
    _main_thread._stop()
    t = _pickSomeNonDaemonThread()
    while t:
        t.join()
        t = _pickSomeNonDaemonThread()
    _main_thread._delete()

def _pickSomeNonDaemonThread():
    for t in enumerate():
        if not t.daemon and t.is_alive():
            return t
    return None

_main_thread 就是主線程,當(dāng)主線程關(guān)閉后,通過 _pickSomeNonDaemonThread() 函數(shù)篩選出不是守護(hù)線程的 (t.daemon 為 False)的,然后通過 t.join() 等待他們的結(jié)束。而 setDaemon(True) 的線程就沒管了。
所以那個(gè)需求就是不行啊。如果是子線程里有個(gè)死循環(huán),并且他是 setDaemon(False) ,那他永遠(yuǎn)也不會(huì)結(jié)束啊。主線程肯定也不會(huì)結(jié)束啊。踩我的請給我個(gè)理由好嗎。

2018年8月19日 19:15