亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python多進(jìn)程multiprocessing.Pool類詳解

 更新時間:2018年04月27日 08:31:56   作者:世界看我我看世界  
這篇文章主要為大家詳細(xì)介紹了Python多進(jìn)程multiprocessing.Pool類,具有一定的參考價值,感興趣的小伙伴們可以參考一下

multiprocessing模塊

multiprocessing包是Python中的多進(jìn)程管理包。它與 threading.Thread類似,可以利用multiprocessing.Process對象來創(chuàng)建一個進(jìn)程。該進(jìn)程可以允許放在Python程序內(nèi)部編寫的函數(shù)中。該Process對象與Thread對象的用法相同,擁有is_alive()、join([timeout])、run()、start()、terminate()等方法。屬性有:authkey、daemon(要通過start()設(shè)置)、exitcode(進(jìn)程在運行時為None、如果為–N,表示被信號N結(jié)束)、name、pid。此外multiprocessing包中也有Lock/Event/Semaphore/Condition類,用來同步進(jìn)程,其用法也與threading包中的同名類一樣。multiprocessing的很大一部份與threading使用同一套API,只不過換到了多進(jìn)程的情境。

這個模塊表示像線程一樣管理進(jìn)程,這個是multiprocessing的核心,它與threading很相似,對多核CPU的利用率會比threading好的多。

看一下Process類的構(gòu)造方法:

__init__(self, group=None, target=None, name=None, args=(), kwargs={})

參數(shù)說明:

group:進(jìn)程所屬組。基本不用
target:表示調(diào)用對象。
args:表示調(diào)用對象的位置參數(shù)元組。
name:別名
kwargs:表示調(diào)用對象的字典。

創(chuàng)建進(jìn)程的簡單實例:

#coding=utf-8
import multiprocessing

def do(n) :
 #獲取當(dāng)前線程的名字
 name = multiprocessing.current_process().name
 print name,'starting'
 print "worker ", n
 return

if __name__ == '__main__' :
 numList = []
 for i in xrange(5) :
  p = multiprocessing.Process(target=do, args=(i,))
  numList.append(p)
  p.start()
  p.join()
  print "Process end."

執(zhí)行結(jié)果:

Process-1 starting
worker 0
Process end.
Process-2 starting
worker 1
Process end.
Process-3 starting
worker 2
Process end.
Process-4 starting
worker 3
Process end.
Process-5 starting
worker 4
Process end.

創(chuàng)建子進(jìn)程時,只需要傳入一個執(zhí)行函數(shù)和函數(shù)的參數(shù),創(chuàng)建一個Process實例,并用其start()方法啟動,這樣創(chuàng)建進(jìn)程比fork()還要簡單。

join()方法表示等待子進(jìn)程結(jié)束以后再繼續(xù)往下運行,通常用于進(jìn)程間的同步。

注意:

在Windows上要想使用進(jìn)程模塊,就必須把有關(guān)進(jìn)程的代碼寫在當(dāng)前.py文件的if __name__ == ‘__main__' :語句的下面,才能正常使用Windows下的進(jìn)程模塊。Unix/Linux下則不需要。

Pool類

在使用Python進(jìn)行系統(tǒng)管理時,特別是同時操作多個文件目錄或者遠(yuǎn)程控制多臺主機,并行操作可以節(jié)約大量的時間。如果操作的對象數(shù)目不大時,還可以直接使用Process類動態(tài)的生成多個進(jìn)程,十幾個還好,但是如果上百個甚至更多,那手動去限制進(jìn)程數(shù)量就顯得特別的繁瑣,此時進(jìn)程池就派上用場了。

Pool類可以提供指定數(shù)量的進(jìn)程供用戶調(diào)用,當(dāng)有新的請求提交到Pool中時,如果池還沒有滿,就會創(chuàng)建一個新的進(jìn)程來執(zhí)行請求。如果池滿,請求就會告知先等待,直到池中有進(jìn)程結(jié)束,才會創(chuàng)建新的進(jìn)程來執(zhí)行這些請求。
下面介紹一下multiprocessing 模塊下的Pool類下的幾個方法

apply()

函數(shù)原型:

apply(func[, args=()[, kwds={}]])

該函數(shù)用于傳遞不定參數(shù),主進(jìn)程會被阻塞直到函數(shù)執(zhí)行結(jié)束(不建議使用,并且3.x以后不在出現(xiàn))。

apply_async()

函數(shù)原型:

apply_async(func[, args=()[, kwds={}[, callback=None]]])

與apply用法一樣,但它是非阻塞且支持結(jié)果返回進(jìn)行回調(diào)。

map()

函數(shù)原型:

map(func, iterable[, chunksize=None])

Pool類中的map方法,與內(nèi)置的map函數(shù)用法行為基本一致,它會使進(jìn)程阻塞直到返回結(jié)果。
注意,雖然第二個參數(shù)是一個迭代器,但在實際使用中,必須在整個隊列都就緒后,程序才會運行子進(jìn)程。

close()

關(guān)閉進(jìn)程池(pool),使其不在接受新的任務(wù)。

terminate()

結(jié)束工作進(jìn)程,不在處理未處理的任務(wù)。

join()

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

multiprocessing.Pool類的實例:

import time
from multiprocessing import Pool
def run(fn):
 #fn: 函數(shù)參數(shù)是數(shù)據(jù)列表的一個元素
 time.sleep(1)
 return fn*fn

if __name__ == "__main__":
 testFL = [1,2,3,4,5,6] 
 print 'shunxu:' #順序執(zhí)行(也就是串行執(zhí)行,單進(jìn)程)
 s = time.time()
 for fn in testFL:
  run(fn)

 e1 = time.time()
 print "順序執(zhí)行時間:", int(e1 - s)

 print 'concurrent:' #創(chuàng)建多個進(jìn)程,并行執(zhí)行
 pool = Pool(5) #創(chuàng)建擁有5個進(jìn)程數(shù)量的進(jìn)程池
 #testFL:要處理的數(shù)據(jù)列表,run:處理testFL列表中數(shù)據(jù)的函數(shù)
 rl =pool.map(run, testFL) 
 pool.close()#關(guān)閉進(jìn)程池,不再接受新的進(jìn)程
 pool.join()#主進(jìn)程阻塞等待子進(jìn)程的退出
 e2 = time.time()
 print "并行執(zhí)行時間:", int(e2-e1)
 print rl

執(zhí)行結(jié)果:

shunxu:
順序執(zhí)行時間: 6
concurrent:
并行執(zhí)行時間: 2
[1, 4, 9, 16, 25, 36]

上例是一個創(chuàng)建多個進(jìn)程并發(fā)處理與順序執(zhí)行處理同一數(shù)據(jù),所用時間的差別。從結(jié)果可以看出,并發(fā)執(zhí)行的時間明顯比順序執(zhí)行要快很多,但是進(jìn)程是要耗資源的,所以平時工作中,進(jìn)程數(shù)也不能開太大。

程序中的r1表示全部進(jìn)程執(zhí)行結(jié)束后全局的返回結(jié)果集,run函數(shù)有返回值,所以一個進(jìn)程對應(yīng)一個返回結(jié)果,這個結(jié)果存在一個列表中,也就是一個結(jié)果堆中,實際上是用了隊列的原理,等待所有進(jìn)程都執(zhí)行完畢,就返回這個列表(列表的順序不定)。
對Pool對象調(diào)用join()方法會等待所有子進(jìn)程執(zhí)行完畢,調(diào)用join()之前必須先調(diào)用close(),讓其不再接受新的Process了。

再看一個實例:

import time
from multiprocessing import Pool
def run(fn) :
 time.sleep(2)
 print fn
if __name__ == "__main__" :
 startTime = time.time()
 testFL = [1,2,3,4,5]
 pool = Pool(10)#可以同時跑10個進(jìn)程
 pool.map(run,testFL)
 pool.close()
 pool.join()  
 endTime = time.time()
 print "time :", endTime - startTime

執(zhí)行結(jié)果:

21

3
4
5
time : 2.51999998093

再次執(zhí)行結(jié)果如下:

1
34

2
5
time : 2.48600006104

結(jié)果中為什么還有空行和沒有折行的數(shù)據(jù)呢?其實這跟進(jìn)程調(diào)度有關(guān),當(dāng)有多個進(jìn)程并行執(zhí)行時,每個進(jìn)程得到的時間片時間不一樣,哪個進(jìn)程接受哪個請求以及執(zhí)行完成時間都是不定的,所以會出現(xiàn)輸出亂序的情況。那為什么又會有沒這行和空行的情況呢?因為有可能在執(zhí)行第一個進(jìn)程時,剛要打印換行符時,切換到另一個進(jìn)程,這樣就極有可能兩個數(shù)字打印到同一行,并且再次切換回第一個進(jìn)程時會打印一個換行符,所以就會出現(xiàn)空行的情況。

進(jìn)程實戰(zhàn)實例

并行處理某個目錄下文件中的字符個數(shù)和行數(shù),存入res.txt文件中,
每個文件一行,格式為:filename:lineNumber,charNumber

import os
import time
from multiprocessing import Pool

def getFile(path) :
 #獲取目錄下的文件list
 fileList = []
 for root, dirs, files in list(os.walk(path)) :
  for i in files :
   if i.endswith('.txt') or i.endswith('.10w') :
    fileList.append(root + "\\" + i)
 return fileList

def operFile(filePath) :
 #統(tǒng)計每個文件中行數(shù)和字符數(shù),并返回
 filePath = filePath
 fp = open(filePath)
 content = fp.readlines()
 fp.close()
 lines = len(content)
 alphaNum = 0
 for i in content :
  alphaNum += len(i.strip('\n'))
 return lines,alphaNum,filePath

def out(list1, writeFilePath) :
 #將統(tǒng)計結(jié)果寫入結(jié)果文件中
 fileLines = 0
 charNum = 0
 fp = open(writeFilePath,'a')
 for i in list1 :
  fp.write(i[2] + " 行數(shù):"+ str(i[0]) + " 字符數(shù):"+str(i[1]) + "\n")
  fileLines += i[0]
  charNum += i[1]
 fp.close()
 print fileLines, charNum

if __name__ == "__main__":
 #創(chuàng)建多個進(jìn)程去統(tǒng)計目錄中所有文件的行數(shù)和字符數(shù)
 startTime = time.time()
 filePath = "C:\\wcx\\a"
 fileList = getFile(filePath)
 pool = Pool(5) 
 resultList =pool.map(operFile, fileList) 
 pool.close()
 pool.join()

 writeFilePath = "c:\\wcx\\res.txt"
 print resultList
 out(resultList, writeFilePath)
 endTime = time.time()
 print "used time is ", endTime - startTime

執(zhí)行結(jié)果:

1

耗時不到1秒,可見多進(jìn)程并發(fā)執(zhí)行速度是很快的。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python使用requests.post方法傳遞form-data類型的Excel數(shù)據(jù)的示例代碼

    python使用requests.post方法傳遞form-data類型的Excel數(shù)據(jù)的示例代碼

    這篇文章介紹了python使用requests.post方法傳遞form-data類型的Excel數(shù)據(jù)的示例代碼,某些post接口,需要發(fā)送multipart/form-data類型的數(shù)據(jù),如何使用python requests來模擬這種類型的請求發(fā)送呢?補充講解了python使用requests post請求發(fā)送form-data類型數(shù)據(jù),一起看看吧
    2024-01-01
  • python使用xpath中遇到:<Element a at 0x39a9a80>到底是什么?

    python使用xpath中遇到:<Element a at 0x39a9a80>到底是什么?

    這篇文章主要給大家詳細(xì)介紹了關(guān)于python使用xpath中遇到:<Element a at 0x39a9a80>的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • win7+Python3.5下scrapy的安裝方法

    win7+Python3.5下scrapy的安裝方法

    這篇文章主要介紹了win7+Python3.5下scrapy的安裝方法
    2018-07-07
  • Python序列對象與String類型內(nèi)置方法詳解

    Python序列對象與String類型內(nèi)置方法詳解

    這篇文章主要介紹了Python序列對象與String類型內(nèi)置方法,結(jié)合實例形式分析了Python序列對象與String類型各種常見內(nèi)置方法相關(guān)使用技巧及操作注意事項,需要的朋友可以參考下
    2019-10-10
  • 給你一面國旗 教你用python畫中國國旗

    給你一面國旗 教你用python畫中國國旗

    朋友圈許多小伙伴都在發(fā):請給我一面五星紅旗的動態(tài),這篇文章就主要教大家如何使用python畫中國國旗,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Django-migrate報錯問題解決方案

    Django-migrate報錯問題解決方案

    這篇文章主要介紹了Django-migrate報錯問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • python數(shù)據(jù)類型判斷type與isinstance的區(qū)別實例解析

    python數(shù)據(jù)類型判斷type與isinstance的區(qū)別實例解析

    這篇文章主要介紹了python數(shù)據(jù)類型判斷type與isinstance的區(qū)別實例解析,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • pandas DataFrame 刪除重復(fù)的行的實現(xiàn)方法

    pandas DataFrame 刪除重復(fù)的行的實現(xiàn)方法

    這篇文章主要介紹了pandas DataFrame 刪除重復(fù)的行的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • pandas?groupby?用法實例詳解

    pandas?groupby?用法實例詳解

    在日常數(shù)據(jù)分析過程中,經(jīng)常有分組的需求。具體來說,就是根據(jù)一個或者多個字段,將數(shù)據(jù)劃分為不同的組,然后進(jìn)行進(jìn)一步分析,比如求分組的數(shù)量,分組內(nèi)的最大值最小值平均值等,下面我們就來看看pandas中的groupby怎么使用,需要的朋友可以參考下
    2022-11-11
  • Anaconda安裝pytorch和paddle的方法步驟

    Anaconda安裝pytorch和paddle的方法步驟

    本文主要介紹了Anaconda安裝pytorch和paddle的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論