理解 Python 併發程式設計中的 join 方法
阿新 • • 發佈:2018-12-09
程式碼清單 - 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
# 永遠執行。。。
注意:
- 程式碼2比程式碼1多了 p.join() ;
- 程式碼3與程式碼2相比,p.daemon = True
解釋:
- 先來看看程式碼3,程序 p 為後臺程序,如果主程序結束了,則應該會打印出
Done!
。
但是,程式碼 3 沒有打印出Done!
,說明主程序沒有結束。
為什麼主程序沒有結束呢?
這是因為p.join()
,主程序在等待子程序 p 終止。
而子程序 p 中裝入的函式 clock 是死迴圈,子程序永遠不會結束;
(按照我的理解)所以主程序也永遠不會結束,主程序的程式碼“卡在”p.join()
這裡,沒有繼續往下執行。 - 再來看看程式碼 2 ,由於
p.daemon = False
,子程序 p 為非後臺程序,子程序 p 並不會隨主程序終止而終止。
這句話是什麼意思?意思就是,即使主程序終止,子程序 p 也不會因主程序終止而終止;子程序是否終止只取決於子程序本身。
程式碼3中,子程序 p 中裝入的函式 clock 是死迴圈,子程序永遠不會結束;
而p.join()
會導致主程序等待子程序 p 終止。
(按照我的理解)所以主程序也永遠不會結束,主程序的程式碼“卡在”p.join()
這裡,沒有繼續往下執行。
參考文獻:
Python 參考手冊 - P337;
Python 核心程式設計 第 2 版 - P522