国产探花免费观看_亚洲丰满少妇自慰呻吟_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())
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安宁市| 岫岩| 通化市| 阿拉善左旗| 通榆县| 阿瓦提县| 卢龙县| 辉南县| 吴川市| 华容县| 依兰县| 威宁| 寿光市| 澎湖县| 沁阳市| 格尔木市| 宁都县| 浦县| 油尖旺区| 屏边| 琼结县| 临泽县| 通州区| 建平县| 长丰县| 栖霞市| 尉氏县| 鲁山县| 顺义区| 平顶山市| 织金县| 新安县| 石嘴山市| 临沭县| 太仓市| 江门市| 绥阳县| 四子王旗| 湖州市| 锡林郭勒盟| 灌南县|