1. 程式人生 > >Python---程序池

Python---程序池

程序池作用:同一時間有多個程序在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 import 
Pool 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了嗎?