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

python并發編程 Process對象的其他屬性方法join方法詳解

系統 1520 0

一 Process對象的join方法

在主進程運行過程中如果想并發地執行其他的任務,我們可以開啟子進程,此時主進程的任務與子進程的任務分兩種情況

情況一:

在主進程的任務與子進程的任務彼此獨立的情況下,主進程的任務先執行完畢后,主進程還需要等待子進程執行完畢,然后統一回收資源。 這種是沒有join方法

情況二:

如果主進程的任務在執行到某一個階段時,需要等待子進程執行完畢后才能繼續執行,

就需要有一種機制能夠讓主進程檢測子進程是否運行完畢,在子進程執行完畢后才繼續執行,否則一直在原地阻塞,這就是join方法的作用

讓主進程等著,所有子進程執行完畢后,主進程才繼續執行

            
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()
  # 主進程 等子進程執行完了
  print("主", os.getpid(), os.getppid())
'''
is running,parent id is <25956>
is done,parent id is <25956>
主 25956 2992
'''
          

子進程運行完,最后打印主進程,主進程結束了 所有僵尸進程都會回收

開啟多個字進程 向操作系統發送信號,但操作系統要處理的任務太多了,先開啟 哪個子進程是隨機的,有時候可能先開啟主進程先,

操作系統什么時候開,開多長時間,我們是不知道的

            
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=('子進程1',))
  p2 = Process(target=task, args=('子進程2',))
  p3 = Process(target=task, args=('子進程3',))
  p4 = Process(target=task, args=('子進程4',))
  p1.start()
  p2.start()
  p3.start()
  p4.start()
  print('主',os.getpid(),os.getppid())
'''
子進程1 is running
子進程2 is running
主 9268 5236
子進程3 is running
子進程4 is running
子進程1 is end
子進程2 is end
子進程3 is end
子進程4 is end

'''
          

也有可能這樣,先開啟主進程,

            
主 9556 5236
子進程1 is running
子進程3 is running
子進程2 is running
子進程4 is running
子進程1 is end
子進程3 is end
子進程2 is end
子進程4 is end
          

p.start() 只是給操作系統發送信號

join 會變串行?

既然join是等待進程結束, 那么我像下面這樣寫, 進程不就又變成串行的了嗎?
當然不是了, 必須明確:p.join()是讓誰等?
很明顯p.join()是讓主線程等待p 子進程的結束,卡住的是主進程而絕非 子進程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=('子進程1',))
  p2 = Process(target=task, args=('子進程2',))
  p3 = Process(target=task, args=('子進程3',))
  p4 = Process(target=task, args=('子進程4',))
  p1.start()
  p2.start()
  p3.start()
  p4.start()
  p1.join()
  p2.join()
  p3.join()
  p4.join()
  print('主',os.getpid(),os.getppid())
          

詳細解析如下:

進程只要start就會在開始運行了,所以p1-p4.start()時,系統中已經有四個并發的進程了

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

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

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

所以不會是串行執行,是并發執行

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

所以就是5秒,就是子進程1 那個等待的時間

            
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=('子進程1',5))
  p2 = Process(target=task, args=('子進程2',2))
  p3 = Process(target=task, args=('子進程3',2))
  p4 = Process(target=task, args=('子進程4',2))
  p1.start()
  p2.start()
  p3.start()
  p4.start()
  p1.join()
  p2.join()
  p3.join()
  p4.join()
  print('主',time.time() - start)
'''
子進程1 is running
子進程2 is running
子進程3 is running
子進程4 is running
子進程2 is end
子進程3 is end
子進程4 is end
子進程1 is end
主 5.413309812545776
'''
          

這種方式就是串行

等子進程1執行時候,子進程2就沒有發送信號,要等子進程1 執行完,再子進程2發送信號 ,開啟子進程2再執行,按照這樣的順序

            
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=('子進程1',5))
  p2 = Process(target=task, args=('子進程2',2))
  p3 = Process(target=task, args=('子進程3',2))
  p4 = Process(target=task, args=('子進程4',2))
  p1.start()
  p1.join()
  p2.start()
  p2.join()
  p3.start()
  p3.join()  
  p4.start()
  p4.join()
  print('主',time.time() - start)
'''
子進程1 is running
子進程1 is end
子進程2 is running
子進程2 is end
子進程3 is running
子進程3 is end
子進程4 is running
子進程4 is end
主 12.212698698043823

'''
          

上述啟動進程與 join進程 可以簡寫為以下

            
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=('子進程1',5))
  p2 = Process(target=task, args=('子進程2',2))
  p3 = Process(target=task, args=('子進程3',2))
  p4 = Process(target=task, args=('子進程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 保證所有子進程執行完 主進程才能工作,不然一直阻塞

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品国产你懂的在线观看 | 欧美视频一区二区专区 | 亚洲日本aⅴ片在线观看香蕉 | 久久久国产免费影院 | 色在线播放| 9久9久热精品视频在线观看 | 一区二区三区高清在线 | 国产色婷婷精品综合在线 | 人人做人人爽久久久精品 | 18p爽视频在线观看免费 | 最近中文字幕无吗高清视频 | 日韩一级欧美一级毛片在 | 欧美日韩精品高清一区二区 | 青青青在线观看免费视频精品 | 午夜日韩在线 | 精品哟哟哟国产在线观看不卡 | 亚洲精品国产经典一区二区 | 黄色毛片视频免费 | 伊人精品成人久久综合欧美 | 在线观看欧洲成人免费视频 | 亚洲一级色| 精品久久伊人 | 免费观看欧美一级特黄 | 国产精品短篇二区 | 国产一级特黄特色aa毛片 | 四虎影视色费永久在线观看 | 国产人成精品综合欧美成人 | 国产亚洲精品久久久久久小说 | 97视频免费人人观看人人 | 亚洲欧美一级久久精品 | 欧美成人高清免费大片观看 | 免费爱爱的视频太爽了 | 欧美成人精品一区二区 | 亚洲高清国产一区二区三区 | 高清午夜毛片 | 欧美成综合网网站 | 人人做人人性 | 欧美日韩色视频 | 五月情视频在线观看 | 福利观看| 理论一级片 |