上一篇文章: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