亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python并發(fā)編程 Process對(duì)象的其他屬性方法join方法詳解

系統(tǒng) 1757 0

一 Process對(duì)象的join方法

在主進(jìn)程運(yùn)行過(guò)程中如果想并發(fā)地執(zhí)行其他的任務(wù),我們可以開啟子進(jìn)程,此時(shí)主進(jìn)程的任務(wù)與子進(jìn)程的任務(wù)分兩種情況

情況一:

在主進(jìn)程的任務(wù)與子進(jìn)程的任務(wù)彼此獨(dú)立的情況下,主進(jìn)程的任務(wù)先執(zhí)行完畢后,主進(jìn)程還需要等待子進(jìn)程執(zhí)行完畢,然后統(tǒng)一回收資源。 這種是沒有join方法

情況二:

如果主進(jìn)程的任務(wù)在執(zhí)行到某一個(gè)階段時(shí),需要等待子進(jìn)程執(zhí)行完畢后才能繼續(xù)執(zhí)行,

就需要有一種機(jī)制能夠讓主進(jìn)程檢測(cè)子進(jìn)程是否運(yùn)行完畢,在子進(jìn)程執(zhí)行完畢后才繼續(xù)執(zhí)行,否則一直在原地阻塞,這就是join方法的作用

讓主進(jìn)程等著,所有子進(jìn)程執(zhí)行完畢后,主進(jìn)程才繼續(xù)執(zhí)行

            
from multiprocessing import Process
import time
import os
def task():
  print("%s is running,parent id is <%s>" % (os.getpid(), os.getppid()))
  time.sleep(3)
  print("%s is done,parent id is <%s>" % (os.getpid(), os.getppid()))
if __name__ == "__main__":
  t = Process(target=task, )
  t.start()
  t.join()
  # 主進(jìn)程 等子進(jìn)程執(zhí)行完了
  print("主", os.getpid(), os.getppid())
'''
is running,parent id is <25956>
is done,parent id is <25956>
主 25956 2992
'''
          

子進(jìn)程運(yùn)行完,最后打印主進(jìn)程,主進(jìn)程結(jié)束了 所有僵尸進(jìn)程都會(huì)回收

開啟多個(gè)字進(jìn)程 向操作系統(tǒng)發(fā)送信號(hào),但操作系統(tǒng)要處理的任務(wù)太多了,先開啟 哪個(gè)子進(jìn)程是隨機(jī)的,有時(shí)候可能先開啟主進(jìn)程先,

操作系統(tǒng)什么時(shí)候開,開多長(zhǎng)時(shí)間,我們是不知道的

            
from multiprocessing import Process
import time
import os
def task(name):
  print('%s is running' %name)
  time.sleep(2)
  print('%s is end' %name)
if __name__ == '__main__':
  p1 = Process(target=task, args=('子進(jìn)程1',))
  p2 = Process(target=task, args=('子進(jìn)程2',))
  p3 = Process(target=task, args=('子進(jìn)程3',))
  p4 = Process(target=task, args=('子進(jìn)程4',))
  p1.start()
  p2.start()
  p3.start()
  p4.start()
  print('主',os.getpid(),os.getppid())
'''
子進(jìn)程1 is running
子進(jìn)程2 is running
主 9268 5236
子進(jìn)程3 is running
子進(jìn)程4 is running
子進(jìn)程1 is end
子進(jìn)程2 is end
子進(jìn)程3 is end
子進(jìn)程4 is end

'''
          

也有可能這樣,先開啟主進(jìn)程,

            
主 9556 5236
子進(jìn)程1 is running
子進(jìn)程3 is running
子進(jìn)程2 is running
子進(jìn)程4 is running
子進(jìn)程1 is end
子進(jìn)程3 is end
子進(jìn)程2 is end
子進(jìn)程4 is end
          

p.start() 只是給操作系統(tǒng)發(fā)送信號(hào)

join 會(huì)變串行?

既然join是等待進(jìn)程結(jié)束, 那么我像下面這樣寫, 進(jìn)程不就又變成串行的了嗎?
當(dāng)然不是了, 必須明確:p.join()是讓誰(shuí)等?
很明顯p.join()是讓主線程等待p 子進(jìn)程的結(jié)束,卡住的是主進(jìn)程而絕非 子進(jìn)程p,

            
from multiprocessing import Process
import time
import os
def task(name):
  print('%s is running' %(name))
  time.sleep(2)
  print('%s is end' %(name))
if __name__ == '__main__':
  p1 = Process(target=task, args=('子進(jìn)程1',))
  p2 = Process(target=task, args=('子進(jìn)程2',))
  p3 = Process(target=task, args=('子進(jìn)程3',))
  p4 = Process(target=task, args=('子進(jìn)程4',))
  p1.start()
  p2.start()
  p3.start()
  p4.start()
  p1.join()
  p2.join()
  p3.join()
  p4.join()
  print('主',os.getpid(),os.getppid())
          

詳細(xì)解析如下:

進(jìn)程只要start就會(huì)在開始運(yùn)行了,所以p1-p4.start()時(shí),系統(tǒng)中已經(jīng)有四個(gè)并發(fā)的進(jìn)程了

而我們p1.join()是在等p1結(jié)束,沒錯(cuò)p1只要不結(jié)束主線程就會(huì)一直卡在原地,這也是問題的關(guān)鍵

join是讓主線程等,而p1-p4仍然是并發(fā)執(zhí)行的,p1.join的時(shí)候,其余p2,p3,p4仍然在運(yùn)行,等#p1.join結(jié)束,可能p2,p3,p4早已經(jīng)結(jié)束了,這樣p2.join,p3.join.p4.join直接通過(guò)檢測(cè),無(wú)需等待

所以4個(gè)join花費(fèi)的總時(shí)間仍然是耗費(fèi)時(shí)間最長(zhǎng)的那個(gè)進(jìn)程運(yùn)行的時(shí)間

所以不會(huì)是串行執(zhí)行,是并發(fā)執(zhí)行

4個(gè)join花費(fèi)的總時(shí)間仍然是耗費(fèi)時(shí)間最長(zhǎng)的那個(gè)進(jìn)程運(yùn)行的時(shí)間

所以就是5秒,就是子進(jìn)程1 那個(gè)等待的時(shí)間

            
from multiprocessing import Process
import time
import os
def task(name,n):
  print('%s is running' %(name))
  time.sleep(n)
  print('%s is end' %(name))
if __name__ == '__main__':
  start = time.time()
  p1 = Process(target=task, args=('子進(jìn)程1',5))
  p2 = Process(target=task, args=('子進(jìn)程2',2))
  p3 = Process(target=task, args=('子進(jìn)程3',2))
  p4 = Process(target=task, args=('子進(jìn)程4',2))
  p1.start()
  p2.start()
  p3.start()
  p4.start()
  p1.join()
  p2.join()
  p3.join()
  p4.join()
  print('主',time.time() - start)
'''
子進(jìn)程1 is running
子進(jìn)程2 is running
子進(jìn)程3 is running
子進(jìn)程4 is running
子進(jìn)程2 is end
子進(jìn)程3 is end
子進(jìn)程4 is end
子進(jìn)程1 is end
主 5.413309812545776
'''
          

這種方式就是串行

等子進(jìn)程1執(zhí)行時(shí)候,子進(jìn)程2就沒有發(fā)送信號(hào),要等子進(jìn)程1 執(zhí)行完,再子進(jìn)程2發(fā)送信號(hào) ,開啟子進(jìn)程2再執(zhí)行,按照這樣的順序

            
from multiprocessing import Process
import time
import os
def task(name,n):
  print('%s is running' %(name))
  time.sleep(n)
  print('%s is end' %(name))
if __name__ == '__main__':
  start = time.time()
  p1 = Process(target=task, args=('子進(jìn)程1',5))
  p2 = Process(target=task, args=('子進(jìn)程2',2))
  p3 = Process(target=task, args=('子進(jìn)程3',2))
  p4 = Process(target=task, args=('子進(jìn)程4',2))
  p1.start()
  p1.join()
  p2.start()
  p2.join()
  p3.start()
  p3.join()  
  p4.start()
  p4.join()
  print('主',time.time() - start)
'''
子進(jìn)程1 is running
子進(jìn)程1 is end
子進(jìn)程2 is running
子進(jìn)程2 is end
子進(jìn)程3 is running
子進(jìn)程3 is end
子進(jìn)程4 is running
子進(jìn)程4 is end
主 12.212698698043823

'''
          

上述啟動(dòng)進(jìn)程與 join進(jìn)程 可以簡(jiǎn)寫為以下

            
from multiprocessing import Process
import time
import os
def task(name,n):
  print('%s is running' %(name))
  time.sleep(n)
  print('%s is end' %(name))
if __name__ == '__main__':
  start = time.time()
  p1 = Process(target=task, args=('子進(jìn)程1',5))
  p2 = Process(target=task, args=('子進(jìn)程2',2))
  p3 = Process(target=task, args=('子進(jìn)程3',2))
  p4 = Process(target=task, args=('子進(jìn)程4',2))
  process_list = [p1,p2,p3,p4]
  for p in process_list:
    p.start()
  for p in process_list:
    p.join()
  print('主',time.time() - start)
          

join 保證所有子進(jìn)程執(zhí)行完 主進(jìn)程才能工作,不然一直阻塞

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久精品动漫99精品动漫 | 久久91亚洲精品久久91综合 | 狠狠干夜夜爽 | 国产乱子伦 | 四虎影视免费永久在线观看黄 | 欧美激情亚洲 | 久久精品国产99久久72 | 狠狠色狠狠色综合网 | 欧美中文字幕视频 | 伊人中文字幕在线观看 | 国内精品久久久久久久 | 亚洲伊人久久大香线蕉结合 | 久久国产美女 | 亚洲成a人v在线观看 | 日本a级精品一区二区三区 日本a毛片在线播放 | a高清免费毛片久久 | 欧美在线激情 | 香蕉超级碰碰碰97视频蜜芽 | 国产成人福利在线 | 天天操夜操 | 亚洲欧美日韩国产精品一区 | 在线亚洲日产一区二区 | 中文字幕久久久 | 日韩精品中文字幕久久 | 日韩精品一区二区三区毛片 | 国产精品人成福利视频 | riav久久中文一区二区 | 99激情网| 免费在线观看h片 | 日韩精品一区二区三区在线观看l | 一级毛片成人免费看a | 日本aaaa特级毛片 | 免费久久精品国产片香蕉 | 国产亚洲精品一区二区在线观看 | 日日夜夜天天 | 九九精品成人免费国产片 | 久久亚洲精品中文字幕 | 97伦理片| 毛茸茸的浓密在线视频 | 国产色婷婷 | 99视频免费观看 |