1. 程式人生 > >Process物件的其他屬性:

Process物件的其他屬性:

標籤(空格分隔): 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 方法,其餘為了解;