前言:
python多進(jìn)程,經(jīng)常在使用,卻沒(méi)有怎么系統(tǒng)的學(xué)習(xí)過(guò),官網(wǎng)上面講得比較細(xì),結(jié)合自己的學(xué)習(xí),整理記錄下官網(wǎng):https://docs.python.org/3/library/multiprocessing.html
multiprocessing簡(jiǎn)介
multiprocessing是python自帶的多進(jìn)程模塊,可以大批量的生成進(jìn)程,在服務(wù)器為多核CPU時(shí)效果更好,類似于threading模塊。相對(duì)于多線程,多進(jìn)程由于獨(dú)享內(nèi)存空間,更穩(wěn)定安全,在運(yùn)維里面做些批量操作時(shí),多進(jìn)程有更多適用的場(chǎng)景
multiprocessing包提供了本地和遠(yuǎn)程兩種并發(fā)操作,有效的避開(kāi)了使用子進(jìn)程而不是全局解釋鎖的線程,因此,multiprocessing可以有效利用到多核處理
Process類
在multiporcessing中,通過(guò)Process類對(duì)象來(lái)批量產(chǎn)生進(jìn)程,使用start()方法來(lái)啟動(dòng)這個(gè)進(jìn)程
1.語(yǔ)法
multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={},*)
group: 這個(gè)參數(shù)一般為空,它只是為了兼容threading.Tread target: 這個(gè)參數(shù)就是通過(guò)run()可調(diào)用對(duì)象的方法,默認(rèn)為空,表示沒(méi)有方法被調(diào)用 name: 表示進(jìn)程名 args: 傳給target調(diào)用方法的tuple(元組)參數(shù) kwargs: 傳給target調(diào)用方法的dict(字典)參數(shù)2.Process類的方法及對(duì)象
run()
該方法是進(jìn)程的運(yùn)行過(guò)程,可以在子類中重寫此方法,一般也很少去重構(gòu)
start()
啟動(dòng)進(jìn)程,每個(gè)進(jìn)程對(duì)象都必須被該方法調(diào)用
join([timeout])
等待進(jìn)程終止,再往下執(zhí)行,可以設(shè)置超時(shí)時(shí)間
name
可以獲取進(jìn)程名字,多個(gè)進(jìn)程也可以是相同的名字
is_alive()
返回進(jìn)程是否還存活,True or False,進(jìn)程存活是指start()開(kāi)始到子進(jìn)程終止
daemon
守護(hù)進(jìn)程的標(biāo)記,一個(gè)布爾值,在start()之后設(shè)置該值,表示是否后臺(tái)運(yùn)行
注意:如果設(shè)置了后臺(tái)運(yùn)行,那么后臺(tái)程序不運(yùn)行再創(chuàng)建子進(jìn)程
pid
可以獲取進(jìn)程ID
exitcode
子進(jìn)程退出時(shí)的值,如果進(jìn)程還沒(méi)有終止,值將是None,如果是負(fù)值,表示子進(jìn)程被終止
terminate()
終止進(jìn)程,如果是Windows,則使用terminateprocess(),該方法對(duì)已經(jīng)退出和結(jié)束的進(jìn)程,將不會(huì)執(zhí)行
以下為一個(gè)簡(jiǎn)單的例子:
#-*- coding:utf8 -*- import multiprocessingimport timedef work(x): time.sleep(1) print time.ctime(),'這是子進(jìn)程[{0}]...'.format(x)if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=work,args=(i,)) print '啟動(dòng)進(jìn)程數(shù):{0}'.format(i) p.start() p.deamon = True
當(dāng)然也可以顯示每個(gè)進(jìn)程的ID
#-*- coding:utf8 -*- import multiprocessingimport timeimport osdef work(x): time.sleep(1) ppid = os.getppid() pid = os.getpid() print time.ctime(),'這是子進(jìn)程[{0},父進(jìn)程:{1},子進(jìn)程:{2}]...'.format(x,ppid,pid)if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=work,args=(i,)) print '啟動(dòng)進(jìn)程數(shù):{0}'.format(i) p.start() p.deamon = True
新聞熱點(diǎn)
疑難解答
圖片精選