Multiprocessing庫里有Process
守護(hù)進(jìn)程
在多進(jìn)程中岩四,同樣存在守護(hù)進(jìn)程的概念哭尝,如果一個(gè)進(jìn)程被設(shè)置為守護(hù)進(jìn)程,當(dāng)父進(jìn)程結(jié)束后剖煌,子進(jìn)程會(huì)自動(dòng)被終止材鹦,我們可以通過設(shè)置 daemon 屬性來控制是否為守護(hù)進(jìn)程。
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self, loop):
Process.__init__(self)
self.loop = loop
def run(self):
for count in range(self.loop):
time.sleep(1)
print(f'pid: {self.pid} loopCount:{count}')
if __name__ == '__main__':
for i in range(2, 5):
p = MyProcess(i)
p.daemon = True
p.start()
print('Main Process is ended')
因?yàn)橹鬟M(jìn)程什么也沒有做耕姊,所以輸出
print('Main Process is ended')
這樣做法就是不用擔(dān)心主進(jìn)程結(jié)束后避免子進(jìn)程獨(dú)立運(yùn)行
進(jìn)程等待
如果我們要子進(jìn)程運(yùn)行完畢才讓主進(jìn)程結(jié)束桶唐,這里就可以用join方法來實(shí)現(xiàn)進(jìn)程等待
for i in range(2, 5):
p = MyProcess(i)
precesses.append(p)
p.daemon = True
p.start()
for p in precesses:
p.join()
join方法默認(rèn)是無限期的,如果某一個(gè)子進(jìn)程陷入死循環(huán)箩做,主進(jìn)程就會(huì)無限等待下去,解決的方法是給子進(jìn)程指定一個(gè)最長(zhǎng)的等待時(shí)長(zhǎng)妥畏。例如我們輸入1就是等待1秒邦邦。代碼如下
for i in range(2, 5):
p = MyProcess(i)
precesses.append(p)
p.daemon = True
p.start()
for p in precesses:
p.join(1)
運(yùn)行結(jié)果
pid: 29136 loopCount:0
pid: 43628 loopCount:0
pid: 43328 loopCount:0
pid: 29136 loopCount:1
pid: 43628 loopCount:1
pid: 43328 loopCount:1
Main Process is ended
終止進(jìn)程
當(dāng)然,終止進(jìn)程不止有守護(hù)進(jìn)程這一種做法醉蚁,我們也可以通過 terminate 方法來終止某個(gè)子進(jìn)程燃辖,另外我們還可以通過 is_alive 方法判斷進(jìn)程是否還在運(yùn)行。
import multiprocessing
import time
def process():
print('Starting')
time.sleep(5)
print('Finished')
if __name__ == '__main__':
p = multiprocessing.Process(target=process)
print('Before:', p, p.is_alive())
p.start()
print('During:', p ,p.is_alive())
p.terminate()
print('Terminate:',p ,p.is_alive())
p.join()
print('Joined:', p ,p.is_alive())
在上面的例子中网棍,我們用Process創(chuàng)建了一個(gè)進(jìn)程黔龟,接著調(diào)用start方法啟動(dòng)這個(gè)進(jìn)程,然后調(diào)用terminate方法將進(jìn)程終止滥玷,最后調(diào)用join方法氏身。另外,在進(jìn)程運(yùn)行不同的階我們還通過 is_alive 方法判斷當(dāng)前進(jìn)程是否還在運(yùn)行惑畴。
運(yùn)行結(jié)果
Before: <Process(Process-1, initial)> False
During: <Process(Process-1, started)> True
Terminate: <Process(Process-1, started)> True
Joined: <Process(Process-1, stopped[SIGTERM])> False
這里有一個(gè)值得注意的地方蛋欣,在調(diào)用terminate方法之后,我們用is_alive方法獲取進(jìn)程的狀態(tài)發(fā)現(xiàn)依然還是運(yùn)行狀態(tài)如贷。在調(diào)用join方法之后陷虎,is_alive方法獲取進(jìn)程的運(yùn)行狀態(tài)才變?yōu)榻K止?fàn)顟B(tài)。
所以杠袱,在調(diào)用 terminate 方法之后尚猿,記得要調(diào)用一下 join 方法,這里調(diào)用 join 方法可以為進(jìn)程提供時(shí)間來更新對(duì)象狀態(tài)楣富,用來反映出最終的進(jìn)程終止效果凿掂。