Python 多進程並行作業中進程池Pool的執行個體,pythonpool

來源:互聯網
上載者:User

Python 多進程並行作業中進程池Pool的執行個體,pythonpool

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

Pool可以提供指定數量的進程,供使用者調用,當有新的請求提交到pool中時,如果池還沒有滿,那麼就會建立一個新的進程用來執行該請求;但如果池中的進程數已經達到規定最大值,那麼該請求就會等待,直到池中有進程結束,才會建立新的進程來它。這裡有一個簡單的例子:

#!/usr/bin/env python#coding=utf-8"""Author: SquallLast modified: 2011-10-18 16:50Filename: pool.pyDescription: a simple sample for pool class"""from multiprocessing import Poolfrom time import sleepdef f(x):  for i in range(10):    print '%s --- %s ' % (i, x)    sleep(1)def main():  pool = Pool(processes=3)  # set the processes max number 3  for i in range(11,20):    result = pool.apply_async(f, (i,))  pool.close()  pool.join()  if result.successful():    print 'successful'if __name__ == "__main__":  main()

先建立容量為3的進程池,然後將f(i)依次傳遞給它,運行指令碼後利用ps aux | grep pool.py查看進程情況,會發現最多隻會有三個進程執行。pool.apply_async()用來向進程池提交目標請求,pool.join()是用來等待進程池中的worker進程執行完畢,防止主進程在worker進程結束前結束。但必pool.join()必須使用在pool.close()或者pool.terminate()之後。其中close()跟terminate()的區別在於close()會等待池中的worker進程執行結束再關閉pool,而terminate()則是直接關閉。result.successful()表示整個調用執行的狀態,如果還有worker沒有執行完,則會拋出AssertionError異常。

利用multiprocessing下的Pool可以很方便的同時自動處理幾百或者上千個並行操作,指令碼的複雜性也大大降低。

——————————————————————————————————

Python多進程並發(multiprocessing)

由於Python設計的限制(我說的是咱們常用的CPython)。最多隻能用滿1個CPU核心。

Python提供了非常好用的多進程包multiprocessing,你只需要定義一個函數,Python會替你完成其他所有事情。藉助這個包,可以輕鬆完成從單進程到並發執行的轉換。

1、建立單一進程

如果我們建立少量進程,可以如下:

import multiprocessingimport timedef func(msg):for i in xrange(3):print msgtime.sleep(1)if __name__ == "__main__":p = multiprocessing.Process(target=func, args=("hello", ))</ p.start()p.join()print "Sub-process done."

2、使用進程池

是的,你沒有看錯,不是線程池。它可以讓你跑滿多核CPU,而且使用方法非常簡單。

注意要用apply_async,如果落下async,就變成阻塞版本了。

processes=4是最多並發進程數量。

importmultiprocessingimporttime deffunc(msg):  foriinxrange(3):    printmsg    time.sleep(1) if__name__=="__main__":  pool=multiprocessing.Pool(processes=4)  foriinxrange(10):    msg="hello %d"%(i)    pool.apply_async(func,(msg,))  pool.close()  pool.join()  print"Sub-process(es) done." 

3、使用Pool,並需要關注結果

更多的時候,我們不僅需要多進程執行,還需要關注每個進程的執行結果,如下:

import multiprocessingimport timedef func(msg):for i in xrange(3):print msgtime.sleep(1)return "done " + msgif __name__ == "__main__":pool = multiprocessing.Pool(processes=4)result = []for i in xrange(10):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."

2014.12.25更新

根據網友評論中的反饋,在Windows下運行有可能崩潰(開啟了一大堆新視窗、進程),可以通過如下調用來解決:

multiprocessing.freeze_support()

簡易worker multiprocessing.Pool

多任務模型設計是一個比較複雜的邏輯,但是python對於多任務的處理卻有種種方便的類庫,不需要過多的糾結進程/線程間的操作細節。比如multiprocessing.Pool就是其中之一。

官方給的範例也很簡單。

from multiprocessing import Pooldef f(x):  return x*xif __name__ == '__main__':  pool = Pool(processes=4)       # start 4 worker processes  result = pool.apply_async(f, [10])  # evaluate "f(10)" asynchronously  print result.get(timeout=1)      # prints "100" unless your computer is *very* slow  print pool.map(f, range(10))     # prints "[0, 1, 4,..., 81]"

並未做太多的詳細解釋。正好我手頭有一段代碼,需要請求幾百個url,解析html頁面擷取一些資訊,單線程for迴圈效率極低,因此看到了這個模組,想用這個實現多任務分析,參考代碼如下:

from multiprocessing import Pooldef analyse_url(url):  #do something with this url  return analysis_resultif __name__ == '__main__':  pool = Pool(processes=10)  result = pool.map(analyse_url, url_list)

確實比以前單線程for迴圈url_list列表,一個個請求analyse_url要快得多,但是帶來的問題就是一旦pool.map沒執行完就ctrl-c中斷程式,程式就會異常,永遠無法退出,參考stackoverflow的這個文章,修改為以下代碼:

#result = pool.map(analyse_url, url_list)result = pool.map_async(analyse_url, url_list).get(120)

至此問題完美解決。

以上這篇Python 多進程並行作業中進程池Pool的執行個體就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.