1. 程式人生 > >[PY3]——一個例子理解多線程和daemon

[PY3]——一個例子理解多線程和daemon

div height 對話 block true nbsp for 守護進程 art

理解

(今天糾結已久,多謝junqi大大幫助理解,一語總結便解心頭疑惑)(下面幾點總結基本就是我們的對話)

1. 進程就相當於一個機器,多進程就相當於有多個機器在同時運行,多線程是多個任務在同一機器上交替運行,你用一段時間,我用一段時間。

2. 所以進程和線程沒有必然聯系。

3. 但是不管進程還是線程,一般都是和任務綁定在一起的,任務結束,銷毀進程和線程。

4. 如果將進程比喻成一臺機器,daemon理解為守護這臺機器的東西,daemon守護一旦結束,機器這個進程就down。

5. 可以這樣說,一個進程裏面會有好幾個線程,全部線程結束,那麽進程就沒有存在的必要了,就會結束。

6. 守護進程這個翻譯有點誤導人,它並不守護什麽,他就提供一些基礎服務,就像保持網絡連接,這種最基礎的功能,就把daemon解釋為服務線程,或許能好理解一些。

def music():
    for i in range(2):
        logging.info("I listening music({})".format(i))
        sleep(10)
        logging.info("end music({})".format(i))

def movie():
    for i in range(2):
        logging.info("I watching movie({})".format(i))
        sleep(15)
        logging.info("end movie({})".format(i))

threads
=[] t1=threading.Thread(target=music) threads.append(t1) t2=threading.Thread(target=movie) threads.append(t2)

Example-1

不設Daemon!將Main進程和music、movie兩個線程的運行時間軸畫出如下:

技術分享

if __name__ == __main__:
    for t in threads:
        # t.setDaemon(True)
        t.start()
        time.sleep(5)

=========運行結果========= 2017-09-18 17:48:16 [Thread-1] I listening music(0) 2017-09-18 17:48:21 [Thread-2] I watching movie(0) 2017-09-18 17:48:26 [Thread-1] end music(0) 2017-09-18 17:48:26 [Thread-1] I listening music(1) 2017-09-18 17:48:36 [Thread-1] end music(1) 2017-09-18 17:48:36 [Thread-2] end movie(0) 2017-09-18 17:48:36 [Thread-2] I watching movie(1) 2017-09-18 17:48:51 [Thread-2] end movie(1)

Example-2

將music和movie都設成Daemon!當把他倆都設置為守護線程後,Main就是唯一的前臺線程了。關鍵點:前臺線程全部結束後,所有的守護線程立刻終止!運行時間軸如下:

技術分享

if __name__ == __main__:
    for t in threads:
        t.setDaemon(True)   # 都設為daemon #
        t.start()
        time.sleep(5)
        
=========運行結果=========
2017-09-18 18:05:38 [Thread-1] I listening music(0)
2017-09-18 18:05:43 [Thread-2] I watching movie(0)
2017-09-18 18:05:48 [Thread-1] end music(0)
2017-09-18 18:05:48 [Thread-1] I listening music(1)

[PY3]——一個例子理解多線程和daemon