Python---程序池
阿新 • • 發佈:2019-01-09
程序池作用:同一時間有多個程序在CPU中執行。
程序池實現步驟:(1)定義一個程序池物件:pool=Pool(processes=n)#允許程序池同時放入n個程序
(2)設定多執行緒:for i in range(n)
(3)程序池實現 pool.apply()同步序列; pool.apply_async()非同步並行
(4)關閉程序池 pool.close()
(5)等待程序池執行完畢 pool.join()
例項:
from multiprocessing importPool import time,os def Foo(i): time.sleep(1) print("in process:",os.getpid()) return i+10 def Bar(arg): print("--->work done:",arg,os.getpid()) if __name__=="__main__": pool=Pool(processes=3) #允許程序池同時放入3個程序 print("主程序:",os.getpid()) for i in range(10): pool.apply_async(func=Foo,args=(i,),callback=Bar) #非同步並行,先調Foo,然後在回撥Bar #pool.apply(func=Foo,args=(i,)) #序列 #pool.apply_async(func=Foo, args=(i,)) #並行 print("end") pool.close() #若不關閉,會有斷言錯誤AssertionError pool.join() #若不join(),程式會直接關閉,不執行子程序;且必須關閉在前,join()在後
最後一句:pool.join()可能會有疑問,為什麼只等待最後一次的執行完畢了呢?非同步回撥執行和同步序列可以理解,那非同步並行呢?難道不需要等待第二次和第三次的執行完畢嗎?
問題2:for i in range(10) 迴圈10個執行緒,一個池中只能放3個,為什麼每次迴圈的3個程序id都與上次相同?在第一次將3個程序放入程序池中難道不應該佔據這個id了嗎?