1. 程式人生 > >python程序池:multiprocessing.pool

python程序池:multiprocessing.pool

在利用Python進行系統管理的時候,特別是同時操作多個檔案目錄,或者遠端控制多臺主機,並行操作可以節約大量的時間。當被操作物件數目不大時,可以直接利用multiprocessing中的Process動態成生多個程序,十幾個還好,但如果是上百個,上千個目標,手動的去限制程序數量卻又太過繁瑣,此時可以發揮程序池的功效。

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]]]) 它是非阻塞
    ,apply(func[, args[, kwds]])是阻塞的(理解區別,看例1例2結果區別)
  • 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
Python 程序的非同步方法

import time from multiprocessing import Process,Pool def f1(n): time.sleep(0.5) # print(n) return n*n if __name__ == '__main__': poo

Python程序的概念和實現

1 使用程序池實現socket 通訊 ftp服務端 #!/usr/bin/python # -*- coding utf8 -*- from multiprocessing import Process,Pool from socket import * impor

關於python程序先close再join的疑惑

import time from multiprocessing import Pool def run(fn): #fn: 函式引數是資料列表的一個元素 time.sleep(1) ret

Python程序的使用

#!/usr/bin/evn python # -*- coding:utf-8 -*- import multiprocessing import time import threading from multiprocessing import Pool,Arr

python程序專題總結 原始碼

  python中兩個常用來處理程序的模組分別是subprocess和multiprocessing,其中subprocess通常用於執行外部程式,比如一些第三方應用程式,而不是Python程式。如果需要實現呼叫外部程式的功能,python的psutil模組是更好的選擇,它不僅支援subprocess提供

python 程序、執行緒 與非同步呼叫、回撥機制

程序池、執行緒池使用案例 程序池與執行緒池使用幾乎相同,只是呼叫模組不同~!! from concurrent.futures import ProcessPoolExecutor # 程序池模組 from concurrent.future

Python程序multiprocessing模組, Process, 程序Pool和Queue

1. multiprocessing模組提供了一個Process類來代表一個程序物件:  (1)   multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daem

PythonPython程序multiprocessing程序Pool的返回值順序

問題起因最近要將一個文字分割成好幾個topic,每個topic設計一個regressor,各regressor是相互獨立的,最後彙總所有topic的regressor得到總得預測結果。沒錯!類似bagging ensemble!只是我沒有抽樣。文字不大,大概3000行,top

Python通過上下文管理器使用程序multiprocessing.Pool

程序池工具multiprocessing.Pool返回的物件其實是個上下文管理器。那麼我們怎麼知道multiprocessing.Pool物件是上下文管理器呢?我們看檢視一下multiprocessing.Pool物件的屬性,可以看到__enter__和__exit__函式