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."
複製程式碼

一次執行結果

12345678910mMsg: hark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~ello 0msg: hello 1msg: hello 2endmsg: hello 3endendend
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."
複製程式碼

一次執行的結果

12345678910msg: hello 0endmsg: hello 1endmsg: hello 2endmsg: hello 3endMark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~Sub-process(es) done. 
回到頂部

例3:使用程序池,並關注結果

複製程式碼
import multiprocessing
import time

def func(msg):
    print "msg:", msg
    time.sleep(3)
    print "end"
    return "done" + msg

if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=4)
    result = []
    for i in xrange(3):
        msg = "hello %d" %(i)
        result.append(pool.apply_async(func, (msg, )))
    pool.close()
    pool.join()
    for res in result:
        print ":::", res.get()
    print "Sub-process(es) done."
複製程式碼

一次執行結果

12345678910msg: hello 0msg: hello 1msg: hello 2endendend::: donehello 0::: donehello 1::: donehello 2Sub-process(es) done.

 :get()函式得出每個返回結果的值

回到頂部

例4:使用多個程序池

複製程式碼
#coding: utf-8
import multiprocessing
import os, time, random

def Lee():
    print "\nRun task Lee-%s" %(os.getpid()) #os.getpid()獲取當前的程序的ID
    start = time.time()
    time.sleep(random.random() * 10) #random.random()隨機生成0-1之間的小數
    end = time.time()
    print 'Task Lee, runs %0.2f seconds.' %(end - start)

def Marlon():
    print "\nRun task Marlon-%s" %(os.getpid())
    start = time.time()
    time.sleep(random.random() * 40)
    end=time.time()
    print 'Task Marlon runs %0.2f seconds.' %(end - start)

def Allen():
    print "\nRun task Allen-%s" %(os.getpid())
    start = time.time()
    time.sleep(random.random() * 30)
    end = time.time()
    print 'Task Allen runs %0.2f seconds.' %(end - start)

def Frank():
    print "\nRun task Frank-%s" %(os.getpid())
    start = time.time()
    time.sleep(random.random() * 20)
    end = time.time()
    print 'Task Frank runs %0.2f seconds.' %(end - start)
        
if __name__=='__main__':
    function_list=  [Lee, Marlon, Allen, Frank] 
    print "parent process %s
            
           

相關推薦

python程序 程序multiprocessing.pool

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

python程序multiprocessing.pool

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

python進程multiprocessing.pool

support 添加 對象 for循環 async nehe 同時 進行 end 本文轉至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基礎上進行了一些小小改動。 在利用Python進行系統管理的時候,特別是

Python進程 multiprocessing Pool

問題 hub gin lock test logger int 新的 eth 1. 背景 由於需要寫python程序, 定時、大量發送htttp請求,並對結果進行處理。 參考其他代碼有進程池,記錄一下。 2. 多進程 vs 多線程 c++程序中,單個模塊通常是單進程,會啟

pythonmultiprocessing(二)multiprocessing.Pool

centos6 bsp ins keys name roc set turn system [實現:多進程paramiko] 1.server_list.txt :格式 HOST PORT USER PASSWD localhost 22 root roo

Python工——程序、執行緒、協程對比

在這條生產線上多招些工人,一起來做剪子,這樣效率是成倍増長,即單程序 多執行緒方式 老闆發現這條生產線上的工人不是越多越好,因為一條生產線的資源以及材料畢竟有限,所以老闆又花了些財力物力購置了另外一條生產線,然後再招些工人這樣效率又再一步提高了,即多程序 多執行緒方式 老闆發現,現在已經有了很多條生產

Mac OSX python版本管理工具pyenv 和 virtualenv搭建

macos pyenv pyenv-virtualenv本博文只是簡單介紹如何安裝 概念問題 請自行查詢環境:10.13.1+shell1、安裝brew官網地址:https://brew.sh//usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercon

Python 執行緒 threading和multiprocessing模組

執行緒是一個程序的實體,是由表示程式執行狀態的暫存器(如程式計數器、棧指標)以及堆疊組成,它是比程序更小的單位。 執行緒是程式中的一個執行流。一個執行流是由CPU執行程式程式碼並操作程式的資料所形成的。因此,執行緒被認為是以CPU為主體的行為。 執行緒不包含

Python執行緒3queue

queue模組實現了多生產者,多消費者佇列。在多執行緒環境下,該佇列能實現多個執行緒間安全的資訊交換。 queue模組介紹 模組實現了3種類型的佇列,區別在於佇列中條目檢索的順序不同。在FIFO佇列中,按照先進先出的順序檢索條目。在LIFO佇列中,最後新增的條目最先檢索到(

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程序程序pool執行時報錯ValueError: Pool not running

【筆記】這個問題的根源在於:pool.close()提前生效,關閉了pool。所以提示pool沒有執行。=============================================我剛接觸python爬蟲,所以有些地方不是很懂。我最近寫了一個python爬蟲,作

Python程序併發操作程序Pool

目錄: multiprocessing模組 Pool類 apply apply_async map close terminate join 程序例項 multiprocessing模組 如果你打算編寫多程序的服務程式,Unix/

Python程序 multiprocessing.Pool

multiprocessing包是Python中的多程序管理包。它與 threading.Thread類似,可以利用multiprocessing.Process物件來建立一個程序。該程序可以允許放在Python程式內部編寫的函式中。該Process物件與Thread物件的用

Python程序multiprocessing模組和程序的實現

1、利用multiprocessing可以在主程序中建立子程序,提升效率,下面是multiprocessing建立程序的簡單例子,和多執行緒的使用非常相似 ?

Python程序併發操作中程序Pool的應用

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

python爬蟲入門八:多程序/執行緒 python佇列Queue Python多執行緒(2)——執行緒同步機制 python學習筆記——多程序中共享記憶體Value & Array python多程序 Python多程序 Python 使用multiprocessing 特別耗記

什麼是多執行緒/多程序 引用蟲師的解釋: 計算機程式只不過是磁碟中可執行的,二進位制(或其它型別)的資料。它們只有在被讀取到記憶體中,被作業系統呼叫的時候才開始它們的生命期。 程序(有時被稱為重量級程序)是程式的一次執行。每個程序都有自己的地址空間,記憶體,資料棧以及其它記錄其執行軌跡的輔助資料

Python 程序 multiprocessing.Pool類詳解

multiprocessing模組 multiprocessing包是Python中的多程序管理包。它與 threading.Thread類

python 程序 —— multiprocessing.Pool

Pool 如果要啟動大量的子程序,可以用程序池的方式批量建立子程序. class multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]]) 控制可以提交

Python程序——程序Pool

1.初始化Pool時,可以指定一個最大程序數,當有新的請求提交到Pool中時,如果池還沒有滿,那麼就會建立一個新的程序用來執行該請求;但如果池中的程序數已經達到指定的最大值,那麼該請求就會等待,直到池