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

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

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

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

主線程不等待子線程,但是主線程結束時,子線程仍能繼續(xù)單獨運行。

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

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

回答
編輯回答
陌璃

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

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

先看看題主的需求

主線程不等待子線程,但是主線程結束時,子線程仍能繼續(xù)單獨運行。

這個需求弄不了,因為主線程退出后,所有子線程都會結束,與有沒有設置 setDeamon 無關,當主線程結束后,python將銷毀運行時環(huán)境。

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

------- 分割線 -------
被踩了??? ??? 哪說錯了啊。主線程將等待該線程結束,所有子線程都會退出的啊,翻源碼來說明,好氣啊。
代碼在 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 就是主線程,當主線程關閉后,通過 _pickSomeNonDaemonThread() 函數(shù)篩選出不是守護線程的 (t.daemon 為 False)的,然后通過 t.join() 等待他們的結束。而 setDaemon(True) 的線程就沒管了。
所以那個需求就是不行啊。如果是子線程里有個死循環(huán),并且他是 setDaemon(False) ,那他永遠也不會結束啊。主線程肯定也不會結束啊。踩我的請給我個理由好嗎。

2018年8月19日 19:15