進程池

轉自:https://www.cnblogs.com/kaituorensheng/p/4465768.html

?

在利用Python進行系統管理的時候,特別是同時操作多個文件目錄,或者遠程控制多臺主機,并行操作可以節約大量的時間。當被操作對象數目不大時,可以直接利用multiprocessing中的Process動態成生多個進程,十幾個還好,但如果是上百個,上千個目標,手動的去限制進程數量卻又太過繁瑣,此時可以發揮進程池的功效。
Pool可以提供指定數量的進程供用戶調用,當有新的請求提交到pool中時,如果池還沒有滿,那么就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到規定最大值,那么該請求就會等待,直到池中有進程結束,才會創建新的進程來它。

?

回到頂部

例1:使用進程池

復制代碼
#coding: utf-8
import multiprocessing
import time def func(msg): print "msg:", msg time.sleep(3) print "end" if __name__ == "__main__": pool = multiprocessing.Pool(processes = 3) for i in xrange(4): msg = "hello %d" %(i) pool.apply_async(func, (msg, )) #維持執行的進程總數為processes,當一個進程執行完畢后會添加新的進程進去 print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~" pool.close() pool.join() #調用join之前,先調用close函數,否則會出錯。執行完close后不會有新的進程加入到pool,join函數等待所有子進程結束 print "Sub-process(es) done."
復制代碼

一次執行結果

1
2
3
4
5
6
7
8
9
10
mMsg: hark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~ello 0
msg: hello 1
msg: hello 2
end
msg: hello 3
end
end
end
Sub-process(es) done.

函數解釋

  • apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞,apply(func[, args[, kwds]])是阻塞的(理解區別,看例1例2結果區別)
  • close() ? ?關閉pool,使其不在接受新的任務。
  • terminate() ? ?結束工作進程,不在處理未完成的任務。
  • join() ? ?主進程阻塞,等待子進程的退出, join方法要在close或terminate之后使用。

執行說明:創建一個進程池pool,并設定進程的數量為3,xrange(4)會相繼產生四個對象[0, 1, 2, 4],四個對象被提交到pool中,因pool指定進程數為3,所以0、1、2會直接送到進程中執行,當其中一個執行完事后才空出一個進程處理對象3,所以會出現輸出“msg: hello 3”出現在"end"后。因為為非阻塞,主函數會自己執行自個的,不搭理進程的執行,所以運行完for循環后直接輸出“mMsg: hark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~”,主程序在pool.join()處等待各個進程的結束。

回到頂部

例2:使用進程池(阻塞)

復制代碼
#coding: utf-8
import multiprocessing
import time def func(msg): print "msg:", msg time.sleep(3) print "end" if __name__ == "__main__": pool = multiprocessing.Pool(processes = 3) for i in xrange(4): msg = "hello %d" %(i) pool.apply(func, (msg, )) #維持執行的進程總數為processes,當一個進程執行完畢后會添加新的進程進去 print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~" pool.close() pool.join() #調用join之前,先調用close函數,否則會出錯。執行完close后不會有新的進程加入到pool,join函數等待所有子進程結束 print "Sub-process(es) done."
復制代碼

一次執行的結果

1
2
3
4
5
6
7
8
9
10
msg: hello 0
end
msg: hello 1
end
msg: hello 2
end
msg: hello 3
end
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done. 
回到頂部

例3:使用進程池,并關注結果

復制代碼
import multiprocessing
import timedef func(msg): print "msg:", msg time.sleep(3) print "end" return "done" + msg if __name__ == "__main__": pool = multiprocessing.Pool(processes=4) result = [] for i in xrange(3): 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."
復制代碼

一次執行結果

1
2
3
4
5
6
7
8
9
10
msg: hello 0
msg: hello 1
msg: hello 2
end
end
end
::: donehello 0
::: donehello 1
::: donehello 2
Sub-process(es) done.

?:get()函數得出每個返回結果的值

回到頂部

例4:使用多個進程池

復制代碼
#coding: utf-8
import multiprocessing
import os, time, random def Lee(): print "\nRun task Lee-%s" %(os.getpid()) #os.getpid()獲取當前的進程的ID start = time.time() time.sleep(random.random() * 10) #random.random()隨機生成0-1之間的小數 end = time.time() print 'Task Lee, runs %0.2f seconds.' %(end - start) def Marlon(): print "\nRun task Marlon-%s" %(os.getpid()) start = time.time() time.sleep(random.random() * 40) end=time.time() print 'Task Marlon runs %0.2f seconds.' %(end - start) def Allen(): print "\nRun task Allen-%s" %(os.getpid()) start = time.time() time.sleep(random.random() * 30) end = time.time() print 'Task Allen runs %0.2f seconds.' %(end - start) def Frank(): print "\nRun task Frank-%s" %(os.getpid()) start = time.time() time.sleep(random.random() * 20) end = time.time() print 'Task Frank runs %0.2f seconds.' %(end - start) if __name__=='__main__': function_list= [Lee, Marlon, Allen, Frank] print "parent process %s" %(os.getpid()) pool=multiprocessing.Pool(4) for func in function_list: pool.apply_async(func) #Pool執行函數,apply執行函數,當有一個進程執行完畢后,會添加一個新的進程到pool中 print 'Waiting for all subprocesses done...' pool.close() pool.join() #調用join之前,一定要先調用close() 函數,否則會出錯, close()執行后不會有新的進程加入到pool,join函數等待素有子進程結束 print 'All subprocesses done.'
復制代碼

一次執行結果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
parent process 7704
Waiting for all subprocesses done...
Run task Lee-6948
Run task Marlon-2896
Run task Allen-7304
Run task Frank-3052
Task Lee, runs 1.59 seconds.
Task Marlon runs 8.48 seconds.
Task Frank runs 15.68 seconds.
Task Allen runs 18.08 seconds.
All subprocesses done.

 

multiprocessing pool map

復制代碼
#coding: utf-8
import multiprocessing def m1(x): print x * x if __name__ == '__main__': pool = multiprocessing.Pool(multiprocessing.cpu_count()) i_list = range(8) pool.map(m1, i_list)
復制代碼

一次執行結果

1
2
3
4
5
6
7
8
0
1
4
9
16
25
36
49

 參考:http://www.dotblogs.com.tw/rickyteng/archive/2012/02/20/69635.aspx 

?

問題:http://bbs.chinaunix.net/thread-4111379-1-1.html

復制代碼
#coding: utf-8
import multiprocessing
import logging def create_logger(i): print i class CreateLogger(object): def __init__(self, func): self.func = func if __name__ == '__main__': ilist = range(10) cl = CreateLogger(create_logger) pool = multiprocessing.Pool(multiprocessing.cpu_count()) pool.map(cl.func, ilist) print "hello------------>"
復制代碼

一次執行結果

1
2
3
4
5
6
7
8
9
10
11
0
1
2
3
4
5
6
7
8
9
hello------------>

轉載于:https://www.cnblogs.com/fengff/p/8257717.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281415.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gulp版本號管理插件注意事項

2019獨角獸企業重金招聘Python工程師標準>>> 打開node_modules\gulp-rev\index.js 第144行 manifest[originalFile] revisionedFile; 更新為: manifest[originalFile] originalFile ?v file.revHash; 打開node_modules\rev-path\index.js 第10行 return filena…

bigfile.to服務器位置,Cloudera Manager 遷移服務器

Cloudera Manager還是比較耗資源的,想把Cloudera Manager,移動到比較好的機器上。在這篇文章中,Cloudera Manager安裝在bigserver1上面,bigserver1是奔騰雙核的CPU。1,Cloudera Manager占資源比較多cloudera manager占…

vue定時ajax獲取數據,vue 中使用 AJAX獲取數據的方法

在VUE開發時,數據可以使用jquery和vue-resource來獲取數據。在獲取數據時,一定需要給一個數據初始值。看下例:new Vue({el:#app,data:{data:""},created:function(){var url"json.jsp";var _selfthis;$.get(url,function…

轉:shell awk

簡單使用: awk :對于文件中一行行的獨處來執行操作 。 awk -F :{print $1,$4} :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。 詳細介紹: AWK命令介紹 awk語言的最基本功能是在文件或字符串中基…

Mac使用crontab來實現定時任務

crontab 定時執行 配置文件都在/etc/crontab下,如果沒有就創建 語法: crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ] 說明: crontab 是用來讓使用者在固定時間或固定間隔執行程序之用,換句話說&#…

前端技術周刊 2018-12-03:DOM

前端快爆 Chrome 71 開始將試用 SXG 功能,它是由 IETF 提出,Web Package 協議規范下的 Signed HTTP Exchanges 功能的縮寫。該技術使得一個第三方服務器可以直接向用戶提供可靠資源,且不用與原站共享 HTTPS 證書密鑰。?點評:一項…

公司新來了一位阿里P9,在全員大會上講葷段子!還是上個世紀的老段子,太爛了!...

阿里P9在坊間的名聲一向不好,這幾年在業界出了不少令人無語的新聞,今天又來了一個:公司新來了一位阿里P9偽高管,全員大會上來先講了一個葷段子,這個破段子還是上個世紀的,太爛了!關于這個段子&a…

【轉】博客美化(1)基本后臺設置與樣式設置

閱讀目錄 1.博客園后臺設置2.自定義樣式的設置博客園美化相關文章目錄:博客園博客美化相關文章目錄 一直都拜膜那些博客園的皮膚設計高手,由于本人對前端研究甚少,所以js,css這種東西只能看得懂最基本的,會簡單改改。然后一直對自…

Airdoc創始人:工智能可以在醫療領域多個環節發揮作用 但有局限性

7月1日,在由武漢國家生物產業基地建設管理辦公室主辦、火石創造承辦、光谷健康智慧園協辦的醫療大數據與醫學人工智能高峰論壇上,Airdoc創始人兼董事長張大磊做了題為《AI在醫療領域中應用的問題與局限》的演講。 Airdoc是醫療領域人工智能領軍企業&…

我的世界服務器抽獎系統怎么弄,我的世界自動識別貨幣抽獎機如何制作

我的世界是一款很經典的沙盒類游戲,在游戲中紅石和命令方塊是這部作品的核心,可以制作很多裝備和道具,下面給大家分享下我的世界自動識別貨幣抽獎機如何制作,希望對大家有所幫助。自動識別貨幣抽獎機制作方法廢話不多說,(貌似一句…

Java并發編程中volatile實現過程詳細解析

2019獨角獸企業重金招聘Python工程師標準>>> 首先并發編程有三大特性: 可見性,有序性,原子性。volatile關鍵字實現了前面兩個特性。那么它是如何實現這兩個特性的呢? 首先是可見性。可見性主要是讓緩存,直接…

《ASP.NET Core 6框架揭秘》實例演示[32]:錯誤頁面的N種呈現方式

由于ASP.NET是一個同時處理多個請求的Web應用框架,所以在處理某個請求過程中出現異常并不會導致整個應用的中止。出于安全方面的考量,為了避免敏感信息外泄,客戶端在默認情況下并不會得到詳細的出錯信息,這無疑會在開發過程中增加…

SpringMVC接受JSON參數詳解及常見錯誤總結我改

SpringMVC接受JSON參數詳解及常見錯誤總結 最近一段時間不想使用Session了,想感受一下Token這樣比較安全,穩健的方式,順便寫一個統一的接口給瀏覽器還有APP。所以把一個練手項目的前臺全部改成Ajax了,跳轉再使用SpringMVC控制轉發…

軟件定義存儲的定制化怎么走?

引言 當前,軟件定義存儲成為業內超高速增長的典型。有研究人員稱,從2014年到2019年,軟件定義存儲市場將從14億美元增長到62億美元以上,年復合增長率將達35%。軟件定義存儲所帶來的優勢顯而易見,但是對于企業來說&#…

Golang并發模型:合理退出并發協程

goroutine作為Golang并發的核心,我們不僅要關注它們的創建和管理,當然還要關注如何合理的退出這些協程,不(合理)退出不然可能會造成阻塞、panic、程序行為異常、數據結果不正確等問題。這篇文章介紹,如何合…

劍網服務器維護,12月31日服務器例行維護公告

隱元秘鑒新增以下江湖行里使用趣味道具的成就:壓酒喚客嘗:使用壓酒三十次欲解紅燭意:使用燭影三十次閑情吹笛子:使用吹斷三十次引弦中落雀:使用千鳥三十次黃云動風色:使用風色三十次卷抒平生意:…

一款 Windows 軟件快捷助手

WPF 開發的 Windows 軟件快捷助手Windows 軟件快捷助手作者:WPFDevelopersOrg - 驚鏵原文鏈接:https://github.com/WPFDevelopersOrg/SoftwareHelper框架使用.NET40;Visual Studio 2019;項目使用 MIT 開源許可協議;項目使用 MVV…

關于8位AD_DA轉換芯片的采樣率問題

關于使用Keil計算程序執行時間 打開Keil程序,進入“啟動/停止調試”界面。在需要暫停的地方設置斷點(在該句程序前雙擊)。在程序上方有一行工具欄:此工具欄分別代表復位、運行、停止、步進、步越、步出、運行到光標處等。 點擊運…

CYQ.Data 數據框架 V4.0 開源版本發布(源碼提供下載,秋色園V2.5版本標配框架)

說明的說明: 博客園團隊兩次移此文出首頁,說 這篇文章不屬于知識分享型文章,并且有廣告嫌疑。 本文的確屬于分享型文章,而且分享的知識點比其它文章都多很多,看看網友回復“謝謝分享”就知道是分享型文章了。 所謂廣告…

oracle 分組后取每組第一條數據

數據格式 分組取第一條的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, test1.* FROM test1) WHERE rn 1 ;