色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

通過(guò)實(shí)例解析python創(chuàng)建進(jìn)程常用方法

瀏覽:28日期:2022-07-20 13:53:23

 運(yùn)行程序時(shí),單線程或單進(jìn)程往往是比較慢的,為加快程序運(yùn)行速度,我們可以使用多進(jìn)程,可以理解為多任務(wù)同時(shí)運(yùn)行,小編的電腦是四核,所以可以設(shè)置四個(gè)進(jìn)程。

下面,我們來(lái)了解下多進(jìn)程的使用:

1、使用multiprocessing模塊創(chuàng)建進(jìn)程

multiprocessing模塊提供了一個(gè)Process類來(lái)代表進(jìn)程對(duì)象,語(yǔ)法如下:

Process([group[,target[,name[,args[,kwargs]]]]])

其中,group:參數(shù)未使用,值始終是None

target:表示當(dāng)前進(jìn)程啟動(dòng)時(shí)執(zhí)行的可調(diào)用對(duì)象

name:為當(dāng)前進(jìn)程實(shí)例的別名

args:表示傳遞給target函數(shù)的參數(shù)元組

kwargs:表示傳遞給target函數(shù)的參數(shù)字典

使用多進(jìn)程的一個(gè)簡(jiǎn)單例子:

from multiprocessing import Process # 導(dǎo)入模塊# 執(zhí)行子進(jìn)程代碼def test(interval): print(’我是子進(jìn)程’)# 執(zhí)行主程序def main(): print(’主進(jìn)程開(kāi)始’) # 實(shí)例化Procss進(jìn)程類 p = Process(target=test,args=(1,)) # 啟動(dòng)子進(jìn)程 p.start() print(’主進(jìn)程結(jié)束’)if __name__ == ’__main__’: main()

結(jié)果:

主進(jìn)程開(kāi)始主進(jìn)程結(jié)束我是子進(jìn)程

Process的實(shí)例p常用的方法除start()外,還有如下常用方法:

is_alive():判斷進(jìn)程實(shí)例是否還在執(zhí)行

join([timeout]):是否等待進(jìn)程實(shí)例執(zhí)行結(jié)束,或等待多少秒

start():啟動(dòng)進(jìn)程實(shí)例(創(chuàng)建子進(jìn)程)

run():如果沒(méi)有給定target參數(shù),對(duì)這個(gè)對(duì)象調(diào)用start()方法時(shí),就將執(zhí)行對(duì)象中的run()方法

terminate():不管任務(wù)是否完成,立即終止

Process類還有如下常用屬性:

name:當(dāng)前進(jìn)程實(shí)例別名,默認(rèn)為Process-N,N為從1開(kāi)始遞增的整數(shù)

pid:當(dāng)前進(jìn)程實(shí)例的PID值

下面是Process類方法和屬性的使用,創(chuàng)建兩個(gè)子進(jìn)程,分別使用os模塊和time模塊輸出父進(jìn)程和子進(jìn)程的id以及子進(jìn)程的時(shí)間,并調(diào)用Process類的name和pid屬性:

# -*- coding:utf-8 -*-from multiprocessing import Processimport timeimport os#兩個(gè)子進(jìn)程將會(huì)調(diào)用的兩個(gè)方法def child_1(interval): print('子進(jìn)程(%s)開(kāi)始執(zhí)行,父進(jìn)程為(%s)' % (os.getpid(), os.getppid())) # 計(jì)時(shí)開(kāi)始 t_start = time.time() # 程序?qū)?huì)被掛起interval秒 time.sleep(interval) # 計(jì)時(shí)結(jié)束 t_end = time.time() print('子進(jìn)程(%s)執(zhí)行時(shí)間為’%0.2f’秒'%(os.getpid(),t_end - t_start))def child_2(interval): print('子進(jìn)程(%s)開(kāi)始執(zhí)行,父進(jìn)程為(%s)' % (os.getpid(), os.getppid())) # 計(jì)時(shí)開(kāi)始 t_start = time.time() # 程序?qū)?huì)被掛起interval秒 time.sleep(interval) # 計(jì)時(shí)結(jié)束 t_end = time.time() print('子進(jìn)程(%s)執(zhí)行時(shí)間為’%0.2f’秒'%(os.getpid(),t_end - t_start))if __name__ == ’__main__’: print('------父進(jìn)程開(kāi)始執(zhí)行-------') # 輸出當(dāng)前程序的ID print('父進(jìn)程PID:%s' % os.getpid()) # 實(shí)例化進(jìn)程p1 p1=Process(target=child_1,args=(1,)) # 實(shí)例化進(jìn)程p2 p2=Process(target=child_2,name='mrsoft',args=(2,)) # 啟動(dòng)進(jìn)程p1 p1.start() # 啟動(dòng)進(jìn)程p2 p2.start() #同時(shí)父進(jìn)程仍然往下執(zhí)行,如果p2進(jìn)程還在執(zhí)行,將會(huì)返回True print('p1.is_alive=%s'%p1.is_alive()) print('p2.is_alive=%s'%p2.is_alive()) #輸出p1和p2進(jìn)程的別名和PID print('p1.name=%s'%p1.name) print('p1.pid=%s'%p1.pid) print('p2.name=%s'%p2.name) print('p2.pid=%s'%p2.pid) print('------等待子進(jìn)程-------') # 等待p1進(jìn)程結(jié)束 p1.join() # 等待p2進(jìn)程結(jié)束 p2.join() print('------父進(jìn)程執(zhí)行結(jié)束-------')

結(jié)果:

------父進(jìn)程開(kāi)始執(zhí)行-------父進(jìn)程PID:13808p1.is_alive=Truep2.is_alive=Truep1.name=Process-1p1.pid=13360p2.name=mrsoftp2.pid=21500------等待子進(jìn)程-------子進(jìn)程(13360)開(kāi)始執(zhí)行,父進(jìn)程為(13808)子進(jìn)程(21500)開(kāi)始執(zhí)行,父進(jìn)程為(13808)子進(jìn)程(13360)執(zhí)行時(shí)間為’1.01’秒子進(jìn)程(21500)執(zhí)行時(shí)間為’2.00’秒------父進(jìn)程執(zhí)行結(jié)束-------

上述代碼中,第一次實(shí)例化Process類時(shí),會(huì)為name屬性默認(rèn)賦值為Process-1,第二次則默認(rèn)為Process-2,但由于實(shí)例化進(jìn)程p2時(shí),設(shè)置了name屬性為mrsoft,所以p2.name的值為mrsoft。

2、使用Process子類創(chuàng)建進(jìn)程

對(duì)于一些簡(jiǎn)單的小任務(wù),通常使用Process(target=test)方式實(shí)現(xiàn)多進(jìn)程。但如果要處理復(fù)雜任務(wù)的進(jìn)程,通常定義一個(gè)類,使其繼承Process類,下面是通過(guò)使用Process子類創(chuàng)建多個(gè)進(jìn)程。

# -*- coding:utf-8 -*-from multiprocessing import Processimport timeimport os#繼承Process類class SubProcess(Process): # 由于Process類本身也有__init__初識(shí)化方法,這個(gè)子類相當(dāng)于重寫(xiě)了父類的這個(gè)方法 def __init__(self,interval,name=’’): # 調(diào)用Process父類的初始化方法 Process.__init__(self) # 接收參數(shù)interval self.interval = interval # 判斷傳遞的參數(shù)name是否存在 if name: # 如果傳遞參數(shù)name,則為子進(jìn)程創(chuàng)建name屬性,否則使用默認(rèn)屬性 self.name = name #重寫(xiě)了Process類的run()方法 def run(self): print('子進(jìn)程(%s) 開(kāi)始執(zhí)行,父進(jìn)程為(%s)'%(os.getpid(),os.getppid())) t_start = time.time() time.sleep(self.interval) t_stop = time.time() print('子進(jìn)程(%s)執(zhí)行結(jié)束,耗時(shí)%0.2f秒'%(os.getpid(),t_stop-t_start))if __name__=='__main__': print('------父進(jìn)程開(kāi)始執(zhí)行-------') # 輸出當(dāng)前程序的ID print('父進(jìn)程PID:%s' % os.getpid()) p1 = SubProcess(interval=1,name=’mrsoft’) p2 = SubProcess(interval=2) #對(duì)一個(gè)不包含target屬性的Process類執(zhí)行start()方法,就會(huì)運(yùn)行這個(gè)類中的run()方法, #所以這里會(huì)執(zhí)行p1.run() # 啟動(dòng)進(jìn)程p1 p1.start() # 啟動(dòng)進(jìn)程p2 p2.start() # 輸出p1和p2進(jìn)程的執(zhí)行狀態(tài),如果真正進(jìn)行,返回True,否則返回False print('p1.is_alive=%s'%p1.is_alive()) print('p2.is_alive=%s'%p2.is_alive()) #輸出p1和p2進(jìn)程的別名和PID print('p1.name=%s'%p1.name) print('p1.pid=%s'%p1.pid) print('p2.name=%s'%p2.name) print('p2.pid=%s'%p2.pid) print('------等待子進(jìn)程-------') # 等待p1進(jìn)程結(jié)束 p1.join() # 等待p2進(jìn)程結(jié)束 p2.join() print('------父進(jìn)程執(zhí)行結(jié)束-------')

結(jié)果:

------父進(jìn)程開(kāi)始執(zhí)行-------父進(jìn)程PID:2512p1.is_alive=Truep2.is_alive=Truep1.name=mrsoftp1.pid=20328p2.name=SubProcess-2p2.pid=13700------等待子進(jìn)程-------子進(jìn)程(20328) 開(kāi)始執(zhí)行,父進(jìn)程為(2512)子進(jìn)程(13700) 開(kāi)始執(zhí)行,父進(jìn)程為(2512)子進(jìn)程(20328)執(zhí)行結(jié)束,耗時(shí)1.00秒子進(jìn)程(13700)執(zhí)行結(jié)束,耗時(shí)2.00秒------父進(jìn)程執(zhí)行結(jié)束-------

上述代碼中,定義了一個(gè)SubProcess子類,繼承multiprocess.Process父類。SubProcess子類中定義了兩個(gè)方法:__init__()初始化方法和run()方法,在__init__()初始化方法中,調(diào)用父類multiprocess.Process的__init__()初始化方法,否則父類的__init__()方法會(huì)被覆蓋,無(wú)法開(kāi)啟進(jìn)程。此外,在SubProcess子類中沒(méi)有定義start()方法,但在主程序中卻調(diào)用了start()方法,此時(shí)就會(huì)自動(dòng)執(zhí)行SubProcess類的run()方法。

3、使用進(jìn)程池Pool創(chuàng)建進(jìn)程

上面我們使用Process類創(chuàng)建了兩個(gè)進(jìn)程,但如果要?jiǎng)?chuàng)建十幾個(gè)或者上百個(gè)進(jìn)程,則需要實(shí)例化更多的Process類,解決這一問(wèn)題的方法就是使用multiprocessing模塊提供的pool類,即Pool進(jìn)程池。

我們先來(lái)了解下Pool類的常用方法:

apply_async(func[,args[,kwds]]):使用非阻塞方式調(diào)用func()函數(shù)(并行執(zhí)行,阻塞方式必須等待上一個(gè)進(jìn)程退出才能執(zhí)行下一個(gè)進(jìn)程),args為傳遞給func()函數(shù)的參數(shù)列表, kwds為傳遞給func()函數(shù)的關(guān)鍵字參數(shù)列表

apply(func[,args[,kwds]]):使用阻塞方式調(diào)用func()函數(shù)

close():關(guān)閉Pool,使其不再接受新的任務(wù)

terminate():不管任務(wù)是否完成,立即終止

join():主進(jìn)程阻塞,等待子進(jìn)程的退出,必須在close或terminate之后使用

下面通過(guò)一個(gè)示例演示一下如何通過(guò)進(jìn)程池創(chuàng)建多進(jìn)程,設(shè)置最大進(jìn)程數(shù)為3,使用非阻塞方式執(zhí)行10個(gè)任務(wù):

# -*- coding=utf-8 -*-from multiprocessing import Poolimport os, timedef task(name): print(’子進(jìn)程(%s)執(zhí)行task %s ...’ % ( os.getpid() ,name)) # 休眠1秒 time.sleep(1) if __name__==’__main__’: print(’父進(jìn)程(%s).’ % os.getpid()) # 定義一個(gè)進(jìn)程池,最大進(jìn)程數(shù)3 p = Pool(3) # 從0開(kāi)始循環(huán)10次 for i in range(10): # 使用非阻塞方式調(diào)用task()函數(shù) p.apply_async(task, args=(i,)) print(’等待所有子進(jìn)程結(jié)束...’) # 關(guān)閉進(jìn)程池,關(guān)閉后p不再接收新的請(qǐng)求 p.close() # 等待子進(jìn)程結(jié)束 p.join() print(’所有子進(jìn)程結(jié)束.’)

結(jié)果:

父進(jìn)程(3856).等待所有子進(jìn)程結(jié)束...子進(jìn)程(18872)執(zhí)行task 0 ...子進(jìn)程(11220)執(zhí)行task 1 ...子進(jìn)程(10140)執(zhí)行task 2 ...子進(jìn)程(18872)執(zhí)行task 3 ...子進(jìn)程(11220)執(zhí)行task 4 ...子進(jìn)程(10140)執(zhí)行task 5 ...子進(jìn)程(18872)執(zhí)行task 6 ...子進(jìn)程(11220)執(zhí)行task 7 ...子進(jìn)程(10140)執(zhí)行task 8 ...子進(jìn)程(18872)執(zhí)行task 9 ...所有子進(jìn)程結(jié)束.

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 综合久久影院 | 欧美一级成人毛片影院 | 午夜无遮挡怕怕怕免费视频 | www.av在线 | 中国老太卖淫播放毛片 | 免费视频一区二区三区四区 | 青草青99久久99九九99九九九 | 久久精品在线免费观看 | 国产孕妇孕交视频在线观看 | 日本xxxxx黄区免费看动漫 | 日韩中文在线观看 | 91成人在线免费视频 | 成人网18免费下 | 亚洲成人手机在线 | 精品午夜寂寞影院在线观看 | 欧美一级俄罗斯黄毛片 | 久草在线国产 | 国产亚洲精品久久综合影院 | 欧美性猛交xxxx免费看手交 | 日本三级香港三级少妇 | 亚洲精品在线播放视频 | 国产精品一久久香蕉国产线看 | 美女张开腿黄网站免费国产 | 亚洲精品91香蕉综合区 | 一级视频免费观看 | 久久久久久久久久久观看 | 国产成人免费在线观看 | 欧美一级毛片免费高清aa | 日韩欧美在线观看视频 | 亚洲精品免费网站 | 高清黄色毛片 | 中文字幕日本不卡 | 国产精品一区久久精品 | 日本亚洲视频 | 国产精品久久久久久久y | 一级a做爰片欧欧美毛片4 | 男女免费视频网站 | 99色视频在线 | 久久一 | 永久精品免费影院在线观看网站 | 手机看片高清国产日韩片 |