網絡編程之併發編程——多進程中的join方法

網絡編程之併發編程——多進程中的join方法

1、Process對象的join方法

在主進程運行過程當中若是想併發地執行其它的任務,咱們能夠開啓子進程,此時主進程的任務與子進程的任務分兩種狀況:python

一、在主進程的任務與子進程的任務彼此獨立的狀況下,主進程的任務先執行完畢後,主進程還須要等待子進程執行完畢,而後統一回收資源。編程

二、若是主進程的任務在執行到某一個階段時,須要等待子進程完畢後才能繼續執行,就須要有一種機制可以讓主進程檢測子進程是否運行完畢,在子進程執行完畢後才繼續執行,不然一直在原地阻塞,這就是join方法的做用。網絡

from multiprocessing import Process
import time
import random
import os
def task():
    print('%s is piaoing' %os.getpid())
    time.sleep(random.randrange(1,3))
    print('%s is piao end' %os.getpid())
if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    p.join() #等待p中止,才執行下一行代碼
    print('主')

有了join,程序不就是串行了嗎??????併發

from multiprocessing import Process
import time
import random
def task(name):
    print('%s is piaoing' %name)
    time.sleep(random.randint(1,3))
    print('%s is piao end' %name)
if __name__ == '__main__':
    p1=Process(target=task,args=('egon',))
    p2=Process(target=task,args=('alex',))
    p3=Process(target=task,args=('yuanhao',))
    p4=Process(target=task,args=('wupeiqi',))
    p1.start()
    p2.start()
    p3.start()
    p4.start()
# 有的同窗會有疑問: 既然join是等待進程結束, 那麼我像下面這樣寫, 進程不就又變成串行的了嗎?
# 固然不是了, 必須明確:p.join()是讓誰等?
# 很明顯p.join()是讓主線程等待p的結束,卡住的是主進程而絕非子進程p,
p1.join()
p2.join()
p3.join()
p4.join()
print('主')

詳細解析以下:dom

進程只要start就會在開始運行了,因此p1~p4.start()時,系統中已經有四個併發的進程了。線程

而咱們p1.join()是在等p1結束,沒錯p1只要不結束主線程就會一直卡在原地,這也是問題的關鍵。code

join是讓主線程等,而p1-p4仍然是併發執行的,p1.join的時候,其他p2,p3,p4仍然在運行,等p1.join結束,可能p2,p3,p4早已經結束了,這樣p2.join,p3.join.p4.join直接經過檢測,無需等待。對象

因此4個join花費的總時間仍然是耗費時間最長的那個進程運行的時間。進程

上述啓動進程與join進程能夠簡寫爲:ip

p_l=[p1,p2,p3,p4]
for p in p_l:
    p.start()
for p in p_l:
    p.join()
相關文章
相關標籤/搜索