Python程式專題2:multiprocessing建立程式

Mark發表於2019-02-16

上一篇文章:Python程式專題1:fork():建立子程式、getpid()、getppid()
下一篇文章:Python程式專題3:繼承Process來建立程式

由於fork()無法對Windows使用,而python是跨平臺的,顯然需要一個新的跨平臺替代品來代替它,那就是multiprocessing模組。

multiprocessing模組中使用Process類來代表程式。

語法:Process([group,target,name,args,kwargs])
group:至今還未使用,值始終為None
target:程式例項所呼叫的物件,一般表示子程式要呼叫的函式。
args:表示呼叫物件的引數,一般是函式的引數
kwargs:表示呼叫物件的關鍵字引數字典。
name:當前程式例項的別名

Process類常用方法:

p.is_alive():判斷程式是否還在執行。如果還在執行,返回true,否則返回false
p.join([timeout]):等待程式例項執行完畢,或等待多少秒
p.run():預設會呼叫target指定的物件,如果沒有給定target引數,對該程式物件呼叫start()方法時,就會執行物件中的run()方法
p.start():啟動程式例項(建立子程式),病執行子進城的run方法
p.terminate():不管任務是否完成,立即終止,同時不會進行任何的清理工作,如果程式p建立了它自己的子程式,這些程式就會
變成殭屍程式,使用時特別注意,如果p儲存了一個鎖或者參與了程式間通訊,那麼使用該方法終止它可能會導致死鎖或者I/O損壞。

Process類常用屬性:

p.daemon:布林值,指示程式是否是後臺程式。當建立它的程式終止時,後臺程式會自動終止。並且,後臺程式無法建立自己的新進城。
注意:p.daemon的值必須在p.start方法呼叫前設定。
p.exitcode:程式的整數退出指令。如果程式仍然在執行,它的值為None,如果值為負數:—N,就表示程式由訊號N所終止。
p.name:當前程式例項別名,預設為Process-N,N為從1開始遞增的整數。
p.pid:當前程式例項的PID

例項1:理解單獨建立程式的相關函式

#該例項是用來理解單獨建立程式的例項
from multiprocessing import Process
import os,time

#將要在子程式中執行的方法
def test(name,interval):
    for i in range(interval):
        print("子程式執行中,name=%s,pid=%d,父程式:%d"%(name,os.getpid(),os.getppid()))
        time.sleep(interval)

if __name__=="__main__":
    print("父程式%d"%os.getpid())
    #建立程式例項,第一個引數傳要在子執行緒執行的函式,第二個引數傳函式需要的引數
    p=Process(target=test,args=(`mark`,2))
    print("子程式要執行了")
    #啟動程式
    p.start()
    p.join()#等待子程式執行結束再繼續執行下面語句
    print("子程式結束了")

結果:

父程式17756
子程式要執行了
子程式執行中,name=mark,pid=17758,父程式:17756
子程式執行中,name=mark,pid=17758,父程式:17756
子程式結束了

例項2:兩個程式同時執行

from multiprocessing import Process
import os
import time

def test1(interval):
    print("test1子程式執行中,pid=%d,父程式:%d"%(os.getpid(),os.getppid()))
    t_start=time.time()
    time.sleep(interval)
    t_end=time.time()
    print("test1執行時間:%0.2f秒"%(t_end-t_start))


def test2(interval):
    print("test2子程式執行中,pid=%d,父程式:%d"%(os.getpid(),os.getppid()))
    t_start=time.time()
    time.sleep(interval)
    t_end=time.time()
    print("test2執行時間:%0.2f秒"%(t_end-t_start))

if __name__=="__main__":
    print("父程式%d"%os.getpid())
    #建立程式例項,第一個引數傳要在子執行緒執行的函式,第二個引數傳函式需要的引數
    p1=Process(target=test1,args=(1,))
    p2=Process(target=test2,name="mark1",args=(2,))
    #啟動程式
    p1.start()
    p2.start()

    print("p2是否在執行:",p2.is_alive())

    p2.join()#等待子程式執行結束再繼續執行下面語句
    print("p2是否在執行:", p2.is_alive())

結果:

父程式15080
p2是否在執行: True
test1子程式執行中,pid=15081,父程式:15080
test2子程式執行中,pid=15082,父程式:15080
test1執行時間:1.00秒
test2執行時間:2.00秒
p2是否在執行: False

相關文章