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

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

因爲fork()沒法對Windows使用,而python是跨平臺的,顯然須要一個新的跨平臺替代品來代替它,那就是multiprocessing模塊。python

multiprocessing模塊中使用Process類來表明進程。segmentfault

語法: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:理解單首創建進程的相關函數code

#該實例是用來理解單首創建進程的實例
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
相關文章
相關標籤/搜索