Process物件的其他屬性:
阿新 • • 發佈:2018-11-04
標籤(空格分隔): process
join方法:
在主程序執行過程中如果想併發地執行其他的任務,我們可以開啟子程序,此時主程序的任務與子程序的任務分兩種情況:
- 情況一:在主程序的任務與子程序的任務彼此獨立的情況下,主程序的任務先執行完畢後,主程序還需要等待子程序執行完畢,然後統一回收資源
- 情況二:如果主程序的任務在執行到某一個階段時,需要等待子程序執行完畢後才能繼續執行,就需要有一種機制能夠讓主程序檢測子程序是否執行完畢,在子程序執行完畢後才繼續執行,否則一直在原地阻塞,這就是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=('anly',)) p3=Process(target=task,args=('xiaohong',)) p4=Process(target=task,args=('wuwu',)) p1.start() p2.start() p3.start() p4.start() # 有的同學會有疑問: 既然join是等待程序結束, 那麼我像下面這樣寫, 程序不就又變成序列的了嗎? # 當然不是了, 必須明確:p.join()是讓誰等? # 很明顯p.join()是讓主執行緒等待p的結束,卡住的是主程序而絕非子程序p, p1.join() p2.join() p3.join() p4.join() print('主')
因為:p1.start()
p2.start()
p3.start()
p4.start()已經發給作業系統了,住程序在等待p1的過程中,p2和p3也在執行,所以說,住程序的等待時間就是:p1,p2,p3,p4最長的時間,並不是一個一個的;
from multiprocessing import Process import time,os def task(): print('%s is running ,parent id is <%s>' %(os.getpid(),os.getppid())) time.sleep(random.randint(1,3)) print('%s is running ,parent id is <%s>' %(os.getpid(),os.getppid())) if __name__ == '__main__': p=Process(target=task) p.start() print(p.is_alive()) p.join() print('主',os.getpid(),os.getppid()) print(p.pid) print(p.is_alive())
- is_alive()是判斷該程序是死程序還是活程序;
from multiprocessing import Process
import time,os
def task():
print('%s is running ,parent id is <%s>' %(os.getpid(),os.getppid()))
time.sleep(random.randint(1,3))
print('%s is running ,parent id is <%s>' %(os.getpid(),os.getppid()))
if __name__ == '__main__':
p=Process(target=task,)
p.start()
p.terminate()
print(p.is_alive())
print('主')
執行結果:
True
主
terminate()只是給作業系統發了個訊號,但是作業系統不能立刻結果的,所以我們要等待一段時間;
在上邊的程式中加入time.sleep(3)
再次執行就可以了;
本節重點就是:join 方法,其餘為了解;