国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Python > 正文

Python進程池Pool應用實例分析

2024-09-09 19:02:59
字體:
來源:轉載
供稿:網友

本文實例講述了Python進程池Pool應用。分享給大家供大家參考,具體如下:

當需要創建的子進程數量不多時,可以直接利用multiprocessing中的Process動態成生多個進程,但如果是上百甚至上千個目標,手動的去創建進程的工作量巨大,此時就可以用到multiprocessing模塊提供的Pool方法。

初始化Pool時,可以指定一個最大進程數,當有新的請求提交到Pool中時,如果池還沒有滿,那么就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到指定的最大值,那么該請求就會等待,直到池中有進程結束,才會用之前的進程來執行新的任務,請看下面的實例:

# -*- coding:utf-8 -*-from multiprocessing import Poolimport os, time, randomdef worker(msg):  t_start = time.time()  print("%s開始執行,進程號為%d" % (msg,os.getpid()))  # random.random()隨機生成0~1之間的浮點數  time.sleep(random.random()*2)   t_stop = time.time()  print(msg,"執行完畢,耗時%0.2f" % (t_stop-t_start))po = Pool(3) # 定義一個進程池,最大進程數3for i in range(0,10):  # Pool().apply_async(要調用的目標,(傳遞給目標的參數元祖,))  # 每次循環將會用空閑出來的子進程去調用目標  po.apply_async(worker,(i,))print("----start----")po.close() # 關閉進程池,關閉后po不再接收新的請求po.join() # 等待po中所有子進程執行完成,必須放在close語句之后print("-----end-----")

運行結果:

----start----
0開始執行,進程號為21466
1開始執行,進程號為21468
2開始執行,進程號為21467
0 執行完畢,耗時1.01
3開始執行,進程號為21466
2 執行完畢,耗時1.24
4開始執行,進程號為21467
3 執行完畢,耗時0.56
5開始執行,進程號為21466
1 執行完畢,耗時1.68
6開始執行,進程號為21468
4 執行完畢,耗時0.67
7開始執行,進程號為21467
5 執行完畢,耗時0.83
8開始執行,進程號為21466
6 執行完畢,耗時0.75
9開始執行,進程號為21468
7 執行完畢,耗時1.03
8 執行完畢,耗時1.05
9 執行完畢,耗時1.69
-----end-----

multiprocessing.Pool常用函數解析:

apply_async(func[, args[, kwds]]) :使用非阻塞方式調用func(并行執行,堵塞方式必須等待上一個進程退出才能執行下一個進程),args為傳遞給func的參數列表,kwds為傳遞給func的關鍵字參數列表; close():關閉Pool,使其不再接受新的任務; terminate():不管任務是否完成,立即終止; join():主進程阻塞,等待子進程的退出, 必須在close或terminate之后使用;

進程池中的Queue

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

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

下面的實例演示了進程池中的進程如何通信:

# -*- coding:utf-8 -*-# 修改import中的Queue為Managerfrom multiprocessing import Manager,Poolimport os,time,randomdef reader(q):  print("reader啟動(%s),父進程為(%s)" % (os.getpid(), os.getppid()))  for i in range(q.qsize()):    print("reader從Queue獲取到消息:%s" % q.get(True))def writer(q):  print("writer啟動(%s),父進程為(%s)" % (os.getpid(), os.getppid()))  for i in "itcast":    q.put(i)if __name__=="__main__":  print("(%s) start" % os.getpid())  q = Manager().Queue() # 使用Manager中的Queue  po = Pool()  po.apply_async(writer, (q,))  time.sleep(1) # 先讓上面的任務向Queue存入數據,然后再讓下面的任務開始從中取數據  po.apply_async(reader, (q,))  po.close()  po.join()  print("(%s) End" % os.getpid())
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邵东县| 尚志市| 万源市| 新干县| 鄯善县| 昌吉市| 泾川县| 大悟县| 资讯 | 德保县| 宁蒗| 龙海市| 朝阳区| 桃源县| 香格里拉县| 潍坊市| 江孜县| 新平| 大冶市| 梅河口市| 鄯善县| 横峰县| 益阳市| 高雄县| 会泽县| 绥芬河市| 玉山县| 胶南市| 富顺县| 教育| 泰兴市| 岳阳县| 新乡县| 上犹县| 鲁甸县| 崇阳县| 商都县| 博白县| 奉新县| 布尔津县| 辰溪县|