上一篇文章:Python進程專題3:繼承Process來建立進程
下一篇文章:Python進程專題5:進程間通訊python
當咱們須要建立大量的進程時,利用multiprocessing模塊提供的Pool來建立進程。segmentfault
進程初始化時,會指定一個最大進程數量,當有新的請求須要建立進程時,若是此時進程池尚未到達設置的最大進程數,該進程池就會建立新的進程來處理該請求,並把該進程放到進程池中,若是進程池已經達到最大數量,請求就會等待,知道進程池中進程數量減小,纔會新建進程來執行請求。app
pool=Pool(numprocess,initializer,initargs) numproxess:須要建立的進程個數,若是忽略將使用cpu_count()的值。即系統上的CPU數量。 initializer:每一個進程啓動時都要調用的對象。 initargs:爲 initalizer傳遞的參數。
multiprocessing.Pool經常使用函數解析:dom
apply_async(要調用的方法,參數列表,關鍵字參數列表):使用非阻塞方式調用指定方法,並行執行(同時執行) apply(要調用的方法,參數列表,關鍵字參數列表):使用阻塞方式調用指定方法,,阻塞方式就是要等上一個進程退出後,下一個進程纔開始運行。 close():關閉進程池,再也不接受進的進程請求,但已經接受的進程仍是會繼續執行。 terminate():無論程任務是否完成,當即結束。 join():主進程堵塞(就是不執行join下面的語句),直到子進程結束,注意,該方法必須在close或terminate以後使用。 pool.map(func,iterable,chunksize):將可調用對象func應用給iterable的每一項,而後以列表形式返回結果, 經過將iterable劃分爲多塊,並分配給工做進程,能夠並行執行。chunksize指定每塊中的項數, 若是數據量較大,能夠增大chunksize的值來提高性能。 pool.map_async(func,iterable,chunksize,callback):與map方法不一樣之處是返回結果是異步的, 若是callback指定,當結果可用時,結果會調用callback。 pool.imap(func,iterable,chunksize):與map()方法的不一樣之處是返回迭代器而非列表。 pool.imap_unordered(func,iterable,chunksize):與imap()不一樣之處是:結果的順序是根據從工做進程接收到的時間而定的。 pool.get(timeout):若是沒有設置timeout,將會一直等待結果, 若是設置了timeout,超過timeout將引起multiprocessing.TimeoutError異常。 pool.ready():若是調用完成,返回True pool.successful():若是調用完成而且沒有引起異常,返回True,若是在結果就緒以前調用,jiang引起AssertionError異常。 pool.wait(timeout):等待結果變爲可用,timeout爲等待時間。
#阻塞與非阻塞對比 from multiprocessing import Pool import os import time import random#用來生成隨機數 def test1(name): print("%s運行中,pid=%d,父進程:%d"%(name,os.getpid(),os.getppid())) t_start=time.time() #random.random()會生成一個0——1的浮點數 time.sleep(random.random()*3) t_end=time.time() print("%s執行時間:%0.2f秒"%(name,t_end-t_start)) pool=Pool(5)#設置線程池中最大線程數量爲5 for xx in range(0,7): #非阻塞運行 pool.apply_async(test1,("mark"+str(id),)) print("--start1--") pool.close()#關閉線程池,關閉後再也不接受進的請求 pool.join()#等待進程池全部進程都執行完畢後,開始執行下面語句 print("--end1--") print("*"*30) pool=Pool(5)#設置線程池中最大線程數量爲5 for xx in range(0,7): #阻塞運行 pool.apply(test1,("mark"+str(id),)) print("--start2--") pool.close()#關閉線程池,關閉後再也不接受進的請求 pool.join()#等待進程池全部進程都執行完畢後,開始執行下面語句 print("--end2--")
結果:異步
--start1-- mark<built-in function id>運行中,pid=28631,父進程:28626 mark<built-in function id>運行中,pid=28632,父進程:28626 mark<built-in function id>運行中,pid=28633,父進程:28626 mark<built-in function id>運行中,pid=28634,父進程:28626 mark<built-in function id>運行中,pid=28636,父進程:28626 mark<built-in function id>執行時間:0.27秒 mark<built-in function id>運行中,pid=28633,父進程:28626 mark<built-in function id>執行時間:0.32秒 mark<built-in function id>運行中,pid=28634,父進程:28626 mark<built-in function id>執行時間:0.18秒 mark<built-in function id>執行時間:0.55秒 mark<built-in function id>執行時間:1.78秒 mark<built-in function id>執行時間:1.92秒 mark<built-in function id>執行時間:2.71秒 --end1-- ****************************** mark<built-in function id>運行中,pid=28647,父進程:28626 mark<built-in function id>執行時間:0.70秒 mark<built-in function id>運行中,pid=28648,父進程:28626 mark<built-in function id>執行時間:1.66秒 mark<built-in function id>運行中,pid=28649,父進程:28626 mark<built-in function id>執行時間:2.87秒 mark<built-in function id>運行中,pid=28650,父進程:28626 mark<built-in function id>執行時間:2.68秒 mark<built-in function id>運行中,pid=28651,父進程:28626 mark<built-in function id>執行時間:1.42秒 mark<built-in function id>運行中,pid=28647,父進程:28626 mark<built-in function id>執行時間:1.20秒 mark<built-in function id>運行中,pid=28648,父進程:28626 mark<built-in function id>執行時間:2.01秒 --start2-- --end2--
查看下面實例前,先來熟悉一下咱們須要用到的一些知識。os.walk(top,topdown=true,onerrorNone,followlinks=false):遍歷目錄地址,返回一個三元組(root,dirs,files)async
top:想要遍歷的目錄函數
root:當前正在遍歷的文件夾地址。性能
dirs:是一個list:當前文件夾下全部目錄的名字(不包括子目錄)ui
files:也是一個list,當前文件夾下全部文件的名字(不包括子目錄文件)線程
topdown:默認爲True:優先遍歷top目錄,爲false會優先遍歷top的子目錄。
onerror:指定一個當方法執行異常時須要調用的方法。
followlinks:默認爲True:會遍歷目錄環境下的快捷方式實際指向目錄。
代碼:
#遍歷目錄文件並求取SHA512的摘要值 import os import multiprocessing import hashlib #定義進程大小 POOLSIZE=2 #工做進程的數量 #能夠讀取的緩衝區大小 BUFSIZE=8196 def mark(filename): try: f=open(filename,"rb") except IOError: return None digest=hashlib.sha512() while True: chunk=f.read(BUFSIZE) if not chunk:break digest.update(chunk) f.close() return filename,digest.digest() def build_map(dir): #定義進程 pool=multiprocessing.Pool(POOLSIZE) #os.path.join:拼接文件路徑 #根據文件目錄和名稱拼接 all_files=(os.path.join(root,name) #循環遍歷當前目錄 for root,dirs,files in os.walk(dir) #取出當前目錄下文件名 for name in files) #dict方法用於將結果轉化成字典 map=dict(pool.imap_unordered(mark,all_files,20)) pool.close() return map if __name__=="__main__": digest_map=build_map("/Users/zhaolixiang/Desktop/python/test1/進程") for item in digest_map: print("文件目錄:",item) print("SHA512摘要值:",digest_map[item]) #個數 print(len(digest_map))
結果
文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/一、fork建立子線程.py
SHA512摘要值: b'x9eYLSxe5xb6xd2xecxd4&xa9xff~m?x87xd2Nxea39Gxe1x8fx9cdx83@x06/Bnxddx1exb5xe0jx10xd1xc9=xfd;y]x8dnR)xbdtxb8xc8xb46rExf8xd7t.xaexbbxe9'
文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/八、JoinableQueue的生產者與消費者.py
SHA512摘要值: b'xfe4x18xee8xd1x97xe7vx86}xe6qnx13xf9Dxf1Xxe3xabx94xebx96xfbxedWx0bOn$x14d/+rx9bx0bxc1xd4x03xadxcbbxf7x8dxd5Ccx03yxd1xb4x801,?,rIXxa28xd7'
文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/十、管道:返回數據.py
SHA512摘要值: b'x85xb1Cxe56x80x1dsx84txf6x95xcbx1d[xdaxe4}n)Y<xd5x10=x94x88xd8xafxccr@eCxc4!xc1xb70x9fzxc6xb1xb9xf6xc4xcexd7x02x86<xc8Ux0fx8bqxdax18ydxa3Kx8bxd6'
文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/十一、進程池.py
SHA512摘要值: b'bBxf4lxccxd5xaetrxc1x816xe5xfc;tx85x86xe5xd3x9e~SH]xe6xcbdxc9xfexe9xfbxfcxeb)Axd2ox8cOxbcx1etxe9xe92^xb5x10xe1xf4xc9\_x0cx8cxa7qxf4(x13Mxbe7'
文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/二、multiprocessing.py
SHA512摘要值: b"mxb2xb5x00M1=qx86xb9Gxf9x02xb1x18xfax08xe7,.xefxff5xebt,nx17xbfB-xc6xc2x9dVxf9x88xa7xd8x1ex9b)x86Nxd5xab x89xa0J}xa9xdcxbcx06mx03xa7x87.x17xcb'x93"
文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/六、驗證:put方法會阻塞.py
SHA512摘要值: b'xa3x80x86xf6xc9xb8x0eOB 5\xd0\x949\xfd\xc2y\x9a\xc7\xca\x9d\xbc%\xa1\xe6
_xfax84xb6x02$xf7x10xbbxb9Nxfbxdexc8xbe6F xd6x87xacxb2xf5x94x0cxedxe0.xf9Txdax91`;xd7x90x86'文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/七、closse方法、get方法、put方法簡單使用.pySHA512摘要值: b'lx98wx8fTx15xdfTx19x91^:xc5xa3x8dxf4x1ex9cx91Exe4xe7xbfxecVx1e\x1bx19xa0ix96Lxc6xc4r.x9bxecx88xe9rxfeOx8bxdfAx90x7f6?xe7x1d8xa6Nx07xdex8dxb6xe7#x02p'文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/五、進程池.pySHA512摘要值: b'xc2xf75x04xbaxa5Xxccx81x88xffxbazxd81@x0bQJ%xbbx15xf3`Qx9a4}xc0x07xa2&axc0x00x0c%xb4[xd2ex18x04x14ytx0cxb0xacx1dxf5xfbxe0\xc7xb6$xd2xf1xd9sePx08'文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/三、multiprocessing.pySHA512摘要值: b'x04N4Dxd5xab}xcfx03xe6x0fVx0fx910x91xe4x81,xbb-xdfxb36Ixf9!x84Axdf.xf3HVxfdx86:x0bx81<+ex00xd1x17uxf5hxb34FxfexebFxf5x1bxc3x8d`Axa0Ax02x10'文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/九、管道.pySHA512摘要值: b'`xdbx8dx90Vx04=x0cxf9x9cxf7{x8fxcax9fxccxb8Dx97xecx82(xd4x9ax84xdb<xb8+x16xd7xecx057xe0x07xe9xc3xdccxe3 t#vxecxb5xe3npxc7~x95xd0J-cxb1xefx03.?xx12'文件目錄: /Users/zhaolixiang/Desktop/python/test1/進程/四、繼承Process建立進程.pySHA512摘要值: b'2xc1xa0x1fxd7xd6xb2x1c}x14xdedx8fxdbxedxd0x91mxc1,xb9xdd?TbXx04#2xfcxb8xbfurxabxfcFcx17x18xc7)sYx82x0exea{5x87xf3x8fcxbaPx91r0xefxabLxa8x1ex15'11