python程序池:multiprocessing.pool
Pool可以提供指定數量的程序供使用者呼叫,當有新的請求提交到pool中時,如果池還沒有滿,那麼就會建立一個新的程序用來執行該請求;但如果池中的程序數已經達到規定最大值,那麼該請求就會等待,直到池中有程序結束,才會建立新的程序來它。
例1:使用程序池
#coding: utf-8 import multiprocessing import time def func(msg): print "msg:", msg time.sleep(3) print "end" if __name__ == "__main__": pool = multiprocessing.Pool(processes = 3)for i in xrange(4): msg = "hello %d" %(i) pool.apply_async(func, (msg, )) #維持執行的程序總數為processes,當一個程序執行完畢後會新增新的程序進去 print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~" pool.close() pool.join() #呼叫join之前,先呼叫close函式,否則會出錯。執行完close後不會有新的程序加入到pool,join函式等待所有子程序結束 print "Sub-process(es) done."
一次執行結果
1 2 3 4 5 6 7 8 9 10 |
mMsg:
hark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~ello 0
msg:
hello 1
msg:
hello 2
end
msg:
hello 3
end
end
end
Sub-process(es)
done.
|
函式解釋:
- apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞
- close() 關閉pool,使其不在接受新的任務。
- terminate() 結束工作程序,不在處理未完成的任務。
- join() 主程序阻塞,等待子程序的退出, join方法要在close或terminate之後使用。
執行說明:建立一個程序池pool,並設定程序的數量為3,xrange(4)會相繼產生四個物件[0, 1, 2, 4],四個物件被提交到pool中,因pool指定程序數為3,所以0、1、2會直接送到程序中執行,當其中一個執行完事後才空出一個程序處理物件3,所以會出現輸出“msg: hello 3”出現在"end"後。因為為非阻塞,主函式會自己執行自個的,不搭理程序的執行,所以執行完for迴圈後直接輸出“mMsg: hark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~”,主程式在pool.join()處等待各個程序的結束。
回到頂部例2:使用程序池(阻塞)
#coding: utf-8 import multiprocessing import time def func(msg): print "msg:", msg time.sleep(3) print "end" if __name__ == "__main__": pool = multiprocessing.Pool(processes = 3) for i in xrange(4): msg = "hello %d" %(i) pool.apply(func, (msg, )) #維持執行的程序總數為processes,當一個程序執行完畢後會新增新的程序進去 print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~" pool.close() pool.join() #呼叫join之前,先呼叫close函式,否則會出錯。執行完close後不會有新的程序加入到pool,join函式等待所有子程序結束 print "Sub-process(es) done."
一次執行的結果
1 2 3 4 5 6 7 8 9 10 |
msg:
hello 0
end
msg:
hello 1
end
msg:
hello 2
end
msg:
hello 3
end
|