1. 程式人生 > >理解 Python 併發程式設計中的 join 方法

理解 Python 併發程式設計中的 join 方法

程式碼清單 - 1:

from multiprocessing import Process
from time import ctime, sleep

def clock(interval):
        while True:
                print("The time is %s" % ctime())
                sleep(interval)

if __name__ == "__main__":
        p = Process(target=clock, args=(2,))
	p.daemon = False
        p.start()

        print("Done!")

輸出:

$ python3 p337_single_process_with_function.py
Done!
The time is Wed Nov 28 18:57:49 2018
The time is Wed Nov 28 18:57:51 2018
The time is Wed Nov 28 18:57:53 2018
The time is Wed Nov 28 18:57:55 2018
# 永遠執行。。

解釋:
子程序 p 是非後臺程序(p.daemon = False),
雖然主程序終止了(從打印出 Done! 可以看出),但子程序不會隨主程序終止而終止;
並且,子程序裝載的函式 clock 是死迴圈,因此永遠執行。

程式碼清單 - 2:

from multiprocessing import Process
from time import ctime, sleep

def clock(interval):
        while True:
                print("The time is %s" % ctime())
                sleep(interval)

if __name__ == "__main__":
        p = Process(target=clock, args=(2,))
        p.daemon = False
        p.start()
        p.join()
        print("Done!")

程式碼清單 - 3:

from multiprocessing import Process
from time import ctime, sleep

def clock(interval):
        while True:
                print("The time is %s" % ctime())
                sleep(interval)

if __name__ == "__main__":
        p = Process(target=clock, args=(2,))
        p.daemon = True
        p.start()
        p.join()
        print("Done!")

程式碼清單2、3的輸出均為:

# 沒有打印出 Done!
The time is Wed Nov 28 19:14:03 2018
The time is Wed Nov 28 19:14:05 2018
# 永遠執行。。。

注意:

  1. 程式碼2比程式碼1多了 p.join() ;
  2. 程式碼3與程式碼2相比,p.daemon = True

解釋:

  1. 先來看看程式碼3,程序 p 為後臺程序,如果主程序結束了,則應該會打印出 Done!
    但是,程式碼 3 沒有打印出 Done! ,說明主程序沒有結束。
    為什麼主程序沒有結束呢?
    這是因為 p.join() ,主程序在等待子程序 p 終止。
    而子程序 p 中裝入的函式 clock 是死迴圈,子程序永遠不會結束;
    (按照我的理解)所以主程序也永遠不會結束,主程序的程式碼“卡在” p.join() 這裡,沒有繼續往下執行。
  2. 再來看看程式碼 2 ,由於 p.daemon = False ,子程序 p 為非後臺程序,子程序 p 並不會隨主程序終止而終止。
    這句話是什麼意思?意思就是,即使主程序終止,子程序 p 也不會因主程序終止而終止;子程序是否終止只取決於子程序本身。
    程式碼3中,子程序 p 中裝入的函式 clock 是死迴圈,子程序永遠不會結束;
    p.join() 會導致主程序等待子程序 p 終止。
    (按照我的理解)所以主程序也永遠不會結束,主程序的程式碼“卡在” p.join() 這裡,沒有繼續往下執行。

參考文獻:
Python 參考手冊 - P337;
Python 核心程式設計 第 2 版 - P522