python多程序 程序池:multiprocessing.pool
在利用Python進行系統管理的時候,特別是同時操作多個檔案目錄,或者遠端控制多臺主機,並行操作可以節約大量的時間。當被操作物件數目不大時,可以直接利用multiprocessing中的Process動態成生多個程序,十幾個還好,但如果是上百個,上千個目標,手動的去限制程序數量卻又太過繁瑣,此時可以發揮程序池的功效。
Pool可以提供指定數量的程序供使用者呼叫,當有新的請求提交到pool中時,如果池還沒有滿,那麼就會建立一個新的程序用來執行該請求;但如果池中的程序數已經達到規定最大值,那麼該請求就會等待,直到池中有程序結束,才會建立新的程序來它。
例1:使用程序池
#coding: utf-8import 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."
一次執行結果
12345678910 | 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."
一次執行的結果
12345678910 | msg: hello 0 end msg: hello 1 end msg: hello 2 end msg: hello 3 end Mark~ 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."
一次執行結果
12345678910 | msg: hello 0 msg: hello 1 msg: hello 2 end end end ::: donehello 0 ::: donehello 1 ::: donehello 2 Sub-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++程序中,單個模塊通常是單進程,會啟
python之multiprocessing(二):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多執行緒3:queue
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
【Python】Python多程序庫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中時,如果池還沒有滿,那麼就會建立一個新的程序用來執行該請求;但如果池中的程序數已經達到指定的最大值,那麼該請求就會等待,直到池