最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 多進(jìn)程并發(fā)操作中進(jìn)程池Pool的實(shí)例

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

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

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

#!/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的進(jìn)程池,然后將f(i)依次傳遞給它,運(yùn)行腳本后利用ps aux | grep pool.py查看進(jìn)程情況,會(huì)發(fā)現(xiàn)最多只會(huì)有三個(gè)進(jìn)程執(zhí)行。pool.apply_async()用來(lái)向進(jìn)程池提交目標(biāo)請(qǐng)求,pool.join()是用來(lái)等待進(jìn)程池中的worker進(jìn)程執(zhí)行完畢,防止主進(jìn)程在worker進(jìn)程結(jié)束前結(jié)束。但必pool.join()必須使用在pool.close()或者pool.terminate()之后。其中close()跟terminate()的區(qū)別在于close()會(huì)等待池中的worker進(jìn)程執(zhí)行結(jié)束再關(guān)閉pool,而terminate()則是直接關(guān)閉。result.successful()表示整個(gè)調(diào)用執(zhí)行的狀態(tài),如果還有worker沒有執(zhí)行完,則會(huì)拋出AssertionError異常。

利用multiprocessing下的Pool可以很方便的同時(shí)自動(dòng)處理幾百或者上千個(gè)并行操作,腳本的復(fù)雜性也大大降低。

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

Python多進(jìn)程并發(fā)(multiprocessing)

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

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

1、新建單一進(jìn)程

如果我們新建少量進(jìn)程,可以如下:

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、使用進(jìn)程池

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

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

processes=4是最多并發(fā)進(jìn)程數(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,并需要關(guān)注結(jié)果

更多的時(shí)候,我們不僅需要多進(jìn)程執(zhí)行,還需要關(guān)注每個(gè)進(jìn)程的執(zhí)行結(jié)果,如下:


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ù)網(wǎng)友評(píng)論中的反饋,在Windows下運(yùn)行有可能崩潰(開啟了一大堆新窗口、進(jìn)程),可以通過如下調(diào)用來(lái)解決:

multiprocessing.freeze_support()

簡(jiǎn)易worker multiprocessing.Pool

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

官方給的范例也很簡(jiǎn)單。

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]"

并未做太多的詳細(xì)解釋。正好我手頭有一段代碼,需要請(qǐng)求幾百個(gè)url,解析html頁(yè)面獲取一些信息,單線程for循環(huán)效率極低,因此看到了這個(gè)模塊,想用這個(gè)實(shí)現(xiàn)多任務(wù)分析,參考代碼如下:

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)

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

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

至此問題完美解決。

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

相關(guān)文章

  • Python語(yǔ)言中的數(shù)據(jù)類型-序列

    Python語(yǔ)言中的數(shù)據(jù)類型-序列

    這篇文章主要介紹了Python語(yǔ)言中的數(shù)據(jù)類型-序列,前面我們提到了Python數(shù)據(jù)類型中的內(nèi)置數(shù)值類型與字符串類型。今天學(xué)習(xí)一下Python的序列數(shù)據(jù)類型,要知道的是在Python中沒有數(shù)組這一數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考一下
    2022-02-02
  • gearman的安裝啟動(dòng)及python API使用實(shí)例

    gearman的安裝啟動(dòng)及python API使用實(shí)例

    這篇文章主要介紹了gearman的安裝啟動(dòng)及python API使用,需要的朋友可以參考下
    2014-07-07
  • django使用graphql的實(shí)例

    django使用graphql的實(shí)例

    這篇文章主要介紹了django使用graphql的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-09-09
  • python base64圖片互轉(zhuǎn),解決base64字符串轉(zhuǎn)PIL圖片對(duì)象報(bào)錯(cuò):binascii.Error: Incorrect padding問題

    python base64圖片互轉(zhuǎn),解決base64字符串轉(zhuǎn)PIL圖片對(duì)象報(bào)錯(cuò):binascii.Error:

    在Base64編碼中,若字符串長(zhǎng)度不是4的倍數(shù),需在末尾添加等號(hào)作為填充,不符合此規(guī)則會(huì)導(dǎo)致在轉(zhuǎn)換為圖片時(shí)出現(xiàn)binascii.Error:Incorrectpadding錯(cuò)誤,正確的填充確保編碼后的字符串可以正確轉(zhuǎn)換成圖片,避免轉(zhuǎn)換錯(cuò)誤
    2024-09-09
  • python反爬蟲方法的優(yōu)缺點(diǎn)分析

    python反爬蟲方法的優(yōu)缺點(diǎn)分析

    在本篇文章里小編給大家整理的是一篇關(guān)于python反爬蟲方法的優(yōu)缺點(diǎn)分析,需要的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • 淺談四種快速易用的Python數(shù)據(jù)可視化方法

    淺談四種快速易用的Python數(shù)據(jù)可視化方法

    這篇文章主要介紹了淺談四種快速易用的Python數(shù)據(jù)可視化方法,數(shù)據(jù)可視化,是指用圖形的方式來(lái)展現(xiàn)數(shù)據(jù),從而更加清晰有效地傳遞信息,主要方法包括圖表類型的選擇和圖表設(shè)計(jì)的準(zhǔn)則,需要的朋友可以參考下
    2023-04-04
  • Python線程threading(Thread類)

    Python線程threading(Thread類)

    這篇文章主要介紹了Python線程threading(Thread類),線程是進(jìn)程的組成部分,一個(gè)進(jìn)程可以擁有多個(gè)線程,更多詳細(xì)內(nèi)容需要的朋友可以參考一下下面文章詳細(xì)內(nèi)容
    2022-07-07
  • python numpy中的polyfit函數(shù)用法

    python numpy中的polyfit函數(shù)用法

    這篇文章主要介紹了python numpy中的polyfit函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Python從入門到精通之Redis操作詳解

    Python從入門到精通之Redis操作詳解

    Redis(Remote?Dictionary?Server)是一種高性能的開源內(nèi)存數(shù)據(jù)庫(kù),它支持多種數(shù)據(jù)結(jié)構(gòu),本文主要為大家介紹了Python中操作Redis數(shù)據(jù)庫(kù)的方法,需要的可以參考下
    2023-08-08
  • python讀取圖片并修改格式與大小的方法

    python讀取圖片并修改格式與大小的方法

    這篇文章主要為大家詳細(xì)介紹了python讀取圖片并修改格式與大小的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評(píng)論

牙克石市| 云安县| 寻乌县| 历史| 宜阳县| 汝阳县| 乐东| 崇义县| 合水县| 建阳市| 屏南县| 封开县| 云阳县| 平利县| 鄂托克旗| 福安市| 琼海市| 梅河口市| 穆棱市| 白水县| 西昌市| 东宁县| 台南市| 永定县| 定日县| 夏河县| 安龙县| 台湾省| 甘孜县| 石渠县| 昆明市| 永年县| 凌源市| 仁寿县| 桐梓县| 库车县| 英吉沙县| 太原市| 广西| 武功县| 吉木萨尔县|