欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 多進程并發(fā)操作中進程池Pool的實例

 更新時間:2017年11月01日 16:10:45   作者:Squall_Liu  
下面小編就為大家?guī)硪黄狿ython 多進程并發(fā)操作中進程池Pool的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在利用Python進行系統(tǒng)管理的時候,特別是同時操作多個文件目錄,或者遠程控制多臺主機,并行操作可以節(jié)約大量的時間。當被操作對象數(shù)目不大時,可以直接利用multiprocessing中的Process動態(tài)成生多個進程,10幾個還好,但如果是上百個,上千個目標,手動的去限制進程數(shù)量卻又太過繁瑣,這時候進程池Pool發(fā)揮作用的時候就到了。

Pool可以提供指定數(shù)量的進程,供用戶調用,當有新的請求提交到pool中時,如果池還沒有滿,那么就會創(chuàng)建一個新的進程用來執(zhí)行該請求;但如果池中的進程數(shù)已經達到規(guī)定最大值,那么該請求就會等待,直到池中有進程結束,才會創(chuàng)建新的進程來它。這里有一個簡單的例子:

#!/usr/bin/env python
#coding=utf-8
"""
Author: Squall
Last modified: 2011-10-18 16:50
Filename: pool.py
Description: a simple sample for pool class
"""

from multiprocessing import Pool
from time import sleep

def 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()

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

利用multiprocessing下的Pool可以很方便的同時自動處理幾百或者上千個并行操作,腳本的復雜性也大大降低。

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

Python多進程并發(fā)(multiprocessing)

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

Python提供了非常好用的多進程包multiprocessing,你只需要定義一個函數(shù),Python會替你完成其他所有事情。借助這個包,可以輕松完成從單進程到并發(fā)執(zhí)行的轉換。

1、新建單一進程

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

import multiprocessing
import time

def func(msg):
for i in xrange(3):
print msg
time.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是最多并發(fā)進程數(shù)量。

import
multiprocessing
import
time
 
def
func(msg):
  for
i
in
xrange(3):
    print
msg
    time.sleep(1)
 
if
__name__
==
"__main__":
  pool
=
multiprocessing.Pool(processes=4)
  for
i
in
xrange(10):
    msg
=
"hello
 %d"
%(i)
    pool.apply_async(func,
(msg,
))
  pool.close()
  pool.join()
  print
"Sub-process(es)
 done."
 


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

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


import multiprocessing

import time



def func(msg):

for i in xrange(3):

print msg

time.sleep(1)

return "done " + msg



if __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更新

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

multiprocessing.freeze_support()

簡易worker multiprocessing.Pool

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

官方給的范例也很簡單。

from multiprocessing import Pool

def f(x):
  return x*x

if __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循環(huán)效率極低,因此看到了這個模塊,想用這個實現(xiàn)多任務分析,參考代碼如下:

from multiprocessing import Pool

def analyse_url(url):
  #do something with this url
  return analysis_result

if __name__ == '__main__':
  pool = Pool(processes=10)
  result = pool.map(analyse_url, url_list)

確實比以前單線程for循環(huán)url_list列表,一個個請求analyse_url要快得多,但是帶來的問題就是一旦pool.map沒執(zhí)行完就ctrl-c中斷程序,程序就會異常,永遠無法退出,參考stackoverflow的這個帖子,修改為以下代碼:

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

至此問題完美解決。

以上這篇Python 多進程并發(fā)操作中進程池Pool的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Python中時間datetime的處理與轉換用法總結

    Python中時間datetime的處理與轉換用法總結

    今天小編就為大家分享一篇關于Python中時間datetime的處理與轉換用法總結,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • python爬蟲入門教程--HTML文本的解析庫BeautifulSoup(四)

    python爬蟲入門教程--HTML文本的解析庫BeautifulSoup(四)

    Beautiful Soup是python的一個庫,最主要的功能是從網頁抓取數(shù)據(jù)。下面這篇文章主要給大家介紹了python爬蟲之HTML文本的解析庫BeautifulSoup的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • python中break、continue 、exit() 、pass終止循環(huán)的區(qū)別詳解

    python中break、continue 、exit() 、pass終止循環(huán)的區(qū)別詳解

    這篇文章主要介紹了python中break、continue 、exit() 、pass終止循環(huán)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Python實現(xiàn)的計算器功能示例

    Python實現(xiàn)的計算器功能示例

    這篇文章主要介紹了Python實現(xiàn)的計算器功能,涉及Python四則運算、取反、百分比等相關數(shù)學運算操作實現(xiàn)技巧,需要的朋友可以參考下
    2018-04-04
  • Python多線程爬蟲簡單示例

    Python多線程爬蟲簡單示例

    這篇文章主要為大家詳細介紹了Python多線程爬蟲簡單示例,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 淺談PYTHON 關于文件的操作

    淺談PYTHON 關于文件的操作

    這篇文章主要介紹了PYTHON 關于文件的操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 阿里云ECS服務器部署django的方法

    阿里云ECS服務器部署django的方法

    今天小編就為大家分享一篇阿里云ECS服務器部署django的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python小白學習包管理器pip安裝

    python小白學習包管理器pip安裝

    在本篇文章里小編給大家分享的是一篇python包管理器pip安裝的相關知識點內容,有興趣的朋友們參考下。
    2020-06-06
  • python安裝模塊如何通過setup.py安裝(超簡單)

    python安裝模塊如何通過setup.py安裝(超簡單)

    這篇文章主要介紹了python安裝模塊如何通過setup.py安裝,安裝方法其實很簡單,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-05-05
  • 在django中form的label和verbose name的區(qū)別說明

    在django中form的label和verbose name的區(qū)別說明

    這篇文章主要介紹了在django中form的label和verbose name的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論