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

python 進(jìn)程池pool使用詳解

 更新時(shí)間:2020年10月15日 11:43:04   作者:小名叫小明  
這篇文章主要介紹了python 進(jìn)程池pool使用的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python進(jìn)程,感興趣的朋友可以了解下

和選用線程池來(lái)關(guān)系多線程類(lèi)似,當(dāng)程序中設(shè)置到多進(jìn)程編程時(shí),Python 提供了更好的管理多個(gè)進(jìn)程的方式,就是使用進(jìn)程池。

在利用 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)程,十幾個(gè)還好,但如果是上百個(gè),上千個(gè)目標(biāo),手動(dòng)的去限制進(jìn)程數(shù)量卻又太過(guò)繁瑣,此時(shí)可以發(fā)揮進(jìn)程池的功效。

Pool可以提供指定數(shù)量的進(jìn)程供用戶(hù)調(diào)用,當(dāng)有新的請(qǐng)求提交到 pool 中時(shí),如果進(jìn)程池還沒(méi)有滿,那么就會(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)它。

Python multiprocessing 模塊提供了 Pool() 函數(shù),專(zhuān)門(mén)用來(lái)創(chuàng)建一個(gè)進(jìn)程池,該函數(shù)的語(yǔ)法格式如下:

multiprocessing.Pool( processes )

其中,processes 參數(shù)用于指定該進(jìn)程池中包含的進(jìn)程數(shù)。

如果進(jìn)程是 None,則默認(rèn)使用 os.cpu_count() 返回的數(shù)字(根據(jù)本地的 cpu 個(gè)數(shù)決定,processes 小于等于本地的 cpu 個(gè)數(shù))。

請(qǐng)看下面的實(shí)例:

from multiprocessing import Pool
import os
import time
import random

def worker(msg):
  t_start = time.time()
  print("%s開(kāi)始執(zhí)行,進(jìn)程號(hào)為%d" % (msg, os.getpid()))
  # random.random()隨機(jī)生成0~1之間的浮點(diǎn)數(shù)
  time.sleep(random.random()*2)
  t_stop = time.time()
  print(msg, "執(zhí)行完畢,耗時(shí)%0.2f" % (t_stop-t_start))

if __name__ == "__main__":
  po = Pool(3) # 定義一個(gè)進(jìn)程池,最大進(jìn)程數(shù)3
  for i in range(0, 8):
    # Pool().apply_async(要調(diào)用的目標(biāo),(傳遞給目標(biāo)的參數(shù)元祖,))
    # 每次循環(huán)將會(huì)用空閑出來(lái)的子進(jìn)程去調(diào)用目標(biāo)
    po.apply_async(worker, (i,))

  print("----start----")
  # 關(guān)閉進(jìn)程池,關(guān)閉后po不再接收新的請(qǐng)求
  po.close()
  # 等待po中所有子進(jìn)程執(zhí)行完成,必須放在close語(yǔ)句之后
  po.join()
  print("-----end-----")

運(yùn)行結(jié)果:

multiprocessing.Pool 常用方法說(shuō)明

apply_async(func[, args[, kwds]]) :使用非阻塞方式調(diào)用 func(并行執(zhí)行,堵塞方式必須等待上一個(gè)進(jìn)程退出才能執(zhí)行下一個(gè)進(jìn)程),args 為傳遞給 func 的參數(shù)列表,kwds 為傳遞給 func 的關(guān)鍵字參數(shù)列表。

close():關(guān)閉 Pool,使其不再接受新的任務(wù)。

terminate():不管任務(wù)是否完成,立即終止。

join():主進(jìn)程阻塞,等待子進(jìn)程的退出, 必須在 close 或 terminate 之后使用。

進(jìn)程池中的 Queue

如果要使用 Pool 創(chuàng)建進(jìn)程,就需要使用 multiprocessing.Manager() 中的 Queue(),而不是 multiprocessing.Queue(),否則會(huì)得到一條如下的錯(cuò)誤信息:

RuntimeError: Queue objects should only be shared between processes through inheritance.

下面的實(shí)例演示了進(jìn)程池中的進(jìn)程如何通信:

from multiprocessing import Manager, Pool
import os
import time
import random

def writer(q):
  print("writer啟動(dòng)(%s),父進(jìn)程為(%s)" % (os.getpid(), os.getppid()))
  for i in "xiaoming":
    q.put(i)

def reader(q):
  print("reader啟動(dòng)(%s),父進(jìn)程為(%s)" % (os.getpid(), os.getppid()))
  for i in range(q.qsize()):
    print("reader從Queue獲取到消息:%s" % q.get(True))

if __name__ == "__main__":
  print("(%s) start" % os.getpid())
  # 使用Manager中的Queue
  q = Manager().Queue()
  po = Pool()
  po.apply_async(writer, (q,))
  # 先讓上面的任務(wù)向Queue存入數(shù)據(jù),然后再讓下面的任務(wù)開(kāi)始從中取數(shù)據(jù)
  time.sleep(1)
  po.apply_async(reader, (q,))
  po.close()
  po.join()
  print("(%s) End" % os.getpid())

運(yùn)行結(jié)果:

(17528) start
writer啟動(dòng)(2216),父進(jìn)程為(17528)
reader啟動(dòng)(2216),父進(jìn)程為(17528)
reader從Queue獲取到消息:x
reader從Queue獲取到消息:i
reader從Queue獲取到消息:a
reader從Queue獲取到消息:o
reader從Queue獲取到消息:m
reader從Queue獲取到消息:i
reader從Queue獲取到消息:n
reader從Queue獲取到消息:g
(17528) End

以上就是python 進(jìn)程池pool使用詳解的詳細(xì)內(nèi)容,更多關(guān)于python 進(jìn)程池pool的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python時(shí)間戳使用和相互轉(zhuǎn)換詳解

    Python時(shí)間戳使用和相互轉(zhuǎn)換詳解

    這篇文章主要為大家詳細(xì)介紹了Python時(shí)間戳使用和相互轉(zhuǎn)換的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 十行Python3代碼實(shí)現(xiàn)把情書(shū)寫(xiě)到圖片中

    十行Python3代碼實(shí)現(xiàn)把情書(shū)寫(xiě)到圖片中

    這篇文章主要為大家介紹了如何利用Python語(yǔ)言實(shí)現(xiàn)將情書(shū)寫(xiě)到照片中,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-04-04
  • Python編程異步爬蟲(chóng)之a(chǎn)iohttp模塊的基本用法

    Python編程異步爬蟲(chóng)之a(chǎn)iohttp模塊的基本用法

    aiohttp?模塊是一個(gè)基于?asyncio?的?HTTP?客戶(hù)端和服務(wù)器框架,可以用于異步處理?HTTP?請(qǐng)求和響應(yīng),這篇文章給大家介紹Python編程異步爬蟲(chóng)之a(chǎn)iohttp模塊的基本用法,感興趣的朋友一起看看吧
    2024-03-03
  • 使用Python爬了4400條淘寶商品數(shù)據(jù),竟發(fā)現(xiàn)了這些“潛規(guī)則”

    使用Python爬了4400條淘寶商品數(shù)據(jù),竟發(fā)現(xiàn)了這些“潛規(guī)則”

    這篇文章主要介紹了使用Python爬了4400條淘寶商品數(shù)據(jù),竟發(fā)現(xiàn)了這些“潛規(guī)則”,筆者用 Python 爬取淘寶某商品的全過(guò)程,并對(duì)商品數(shù)據(jù)進(jìn)行了挖掘與分析,最終得出結(jié)論。需要的朋友可以參考下
    2018-03-03
  • 使用 Python 處理 JSON 格式的數(shù)據(jù)

    使用 Python 處理 JSON 格式的數(shù)據(jù)

    JSON 是一個(gè)很好的選擇。如果你對(duì) Python 有所了解,就更加事半功倍了。下面就來(lái)介紹一下如何使用 Python 處理 JSON 數(shù)據(jù)。感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • 基于Python的XSS測(cè)試工具XSStrike使用方法

    基于Python的XSS測(cè)試工具XSStrike使用方法

    XSS(Cross Site Scripting,跨站腳本攻擊)是一類(lèi)特殊的Web客戶(hù)端腳本注入攻擊手段,通常指攻擊者通過(guò)“HTML注入”篡改了網(wǎng)頁(yè),插入惡意的腳本,從而在用戶(hù)瀏覽網(wǎng)頁(yè)時(shí)控制瀏覽器的一種攻擊。
    2017-07-07
  • Python pip更換清華源鏡像的詳細(xì)教程

    Python pip更換清華源鏡像的詳細(xì)教程

    大家經(jīng)常會(huì)使用 pip 進(jìn)行python 的第三方庫(kù)安裝,但是,有時(shí)會(huì)出現(xiàn)ERROR: No matching distribution found for PyQt6這類(lèi)的錯(cuò)誤,其實(shí)大部分原因是我們國(guó)內(nèi)網(wǎng)絡(luò)的問(wèn)題,所以本文給大家介紹了Python pip更換清華源鏡像的詳細(xì)教程,需要的朋友可以參考下
    2024-09-09
  • 淺談PyTorch的可重復(fù)性問(wèn)題(如何使實(shí)驗(yàn)結(jié)果可復(fù)現(xiàn))

    淺談PyTorch的可重復(fù)性問(wèn)題(如何使實(shí)驗(yàn)結(jié)果可復(fù)現(xiàn))

    今天小編就為大家分享一篇淺談PyTorch的可重復(fù)性問(wèn)題(如何使實(shí)驗(yàn)結(jié)果可復(fù)現(xiàn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • 詳解Numpy中的廣播原則/機(jī)制

    詳解Numpy中的廣播原則/機(jī)制

    這篇文章主要介紹了Numpy中的廣播原則/機(jī)制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • python數(shù)據(jù)結(jié)構(gòu)之列表和元組的詳解

    python數(shù)據(jù)結(jié)構(gòu)之列表和元組的詳解

    這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)之列表和元組的詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家徹底理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09

最新評(píng)論