麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 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())
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日本在线观看高清完整版 | 午夜视频色 | 久久精品亚洲一区 | 久久国产一级片 | 日本中文视频 | 欧美性受xxxxxx黑人xyx性爽 | 色视频91| 色妞妞视频 | 免费永久在线观看黄网 | arabxxxxvideos| 欧美aaa| 久久婷婷一区二区三区 | 黄色网址免费在线 | 国产精品一区二区三区在线看 | 亚洲一区二区三区视频免费 | 成年性羞羞视频免费观看 | 美国一级黄色毛片 | 久精品久久 | 久久草草影视免费网 | 色日本视频| 国产91久久久久 | 免费久久精品 | 国产九九九九 | 99国内精品视频 | 亚洲精品一二三区 | 午夜国产成人 | 麻豆视频免费网站 | 亚洲网站在线播放 | 天天干导航 | 久久久久亚洲视频 | 91丝袜 | 国产精品久久久久久久久粉嫩 | 热@国产| 日韩视频观看 | 99精品视频免费 | 亚洲国产精品久久久久婷婷老年 | 日本成人一二三区 | 涩涩激情网 | 国产一区二区免费在线观看 | 国产精品视频一区二区三区综合 | 亚洲午夜视频在线 |