目錄
零基礎(chǔ) Python 學(xué)習(xí)路線推薦 : Python 學(xué)習(xí)目錄 >> Python 基礎(chǔ)入門
Python 進(jìn)程池 Pool 和前面講解的** Python 線程池** 類似,雖然使用多進(jìn)程能提高效率榜掌,但是進(jìn)程的創(chuàng)建會消耗大量的計算機(jī)資源(進(jìn)程 Process 的創(chuàng)建遠(yuǎn)遠(yuǎn)大于線程 Thread 創(chuàng)建占用的資源)叉寂,線程是計算機(jī)最小的運(yùn)行單位**橱夭,連線程都需要使用線程池器净,進(jìn)程有什么理由不使用進(jìn)程池?
需要注意的是齿税,在 Windows 上要想使用進(jìn)程模塊寞奸,就必須把有關(guān)進(jìn)程的代碼寫在if __name__ == ‘__main__’ 內(nèi),否則在 Windows 下使用進(jìn)程模塊會產(chǎn)生異常括丁。 Unix / Linux 下則不需要荞下。
一.Python 進(jìn)程池 multiprocessing.Pool 介紹
Pool 類可以提供指定數(shù)量的進(jìn)程供用戶調(diào)用,當(dāng)有新的請求提交到 Pool 中時史飞,如果池還沒有滿尖昏,就會創(chuàng)建一個新的進(jìn)程來執(zhí)行請求。如果池滿构资,請求就會告知先等待抽诉,直到池中有進(jìn)程結(jié)束,才會創(chuàng)建新的進(jìn)程來執(zhí)行這些請求蚯窥。
# 導(dǎo)入進(jìn)程模塊
import multiprocessing
# 最多允許3個進(jìn)程同時運(yùn)行
pool = multiprocessing.Pool(processes = 3)
1掸鹅、apply — 該函數(shù)用于傳遞不定參數(shù),主進(jìn)程會被阻塞直到函數(shù)執(zhí)行結(jié)束(不建議使用拦赠,并且 3.x 以后不在出現(xiàn))巍沙,函數(shù)原型如下:
apply(func, args=(), kwds={})
**2、apply_async **— 與 apply 用法一致荷鼠,但它是非阻塞的且支持結(jié)果返回后進(jìn)行回調(diào)句携,函數(shù)原型如下:
apply_async(func[, args=()[, kwds={}[, callback=None]]])
3、map — Pool 類中的 map 方法允乐,與內(nèi)置的 map 函數(shù)用法基本一致矮嫉,它會使進(jìn)程阻塞直到結(jié)果返回,函數(shù)原型如下:
map(func, iterable, chunksize=None)
注意:雖然第二個參數(shù)是一個迭代器牍疏,但在實際使用中蠢笋,必須在整個隊列都就緒后,程序才會運(yùn)行子進(jìn)程鳞陨。
**4昨寞、map_async **— 與 map 用法一致,但是它是非阻塞的。其有關(guān)事項見 apply_async援岩,函數(shù)原型如下:
map_async(func, iterable, chunksize, callback)
5歼狼、close — 關(guān)閉進(jìn)程池(pool),使其不在接受新的任務(wù)享怀。
6羽峰、terminal — 結(jié)束工作進(jìn)程,不在處理未處理的任務(wù)添瓷。
7梅屉、join — 主進(jìn)程阻塞等待子進(jìn)程的退出, join 方法要在 close 或 terminate 之后使用鳞贷。
二.Python 進(jìn)程池 multiprocessing.Pool 使用
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 進(jìn)程池 multiprocessing.Pool.py
@Time:2021/05/09 07:37
@Motto:不積跬步無以至千里履植,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累悄晃!
"""
import multiprocessing
import time
def func(msg):
print("in:", msg)
time.sleep(3)
print("out,", msg)
if __name__ == "__main__":
# 這里設(shè)置允許同時運(yùn)行的的進(jìn)程數(shù)量要考慮機(jī)器cpu的數(shù)量,進(jìn)程的數(shù)量最好別小于cpu的數(shù)量凿滤,
# 因為即使大于cpu的數(shù)量妈橄,增加了任務(wù)調(diào)度的時間,效率反而不能有效提高
pool = multiprocessing.Pool(processes = 3)
item_list = ['processes1' ,'processes2' ,'processes3' ,'processes4' ,'processes5' ,]
count = len(item_list)
for item in item_list:
msg = "python教程 %s" %item
# 維持執(zhí)行的進(jìn)程總數(shù)為processes翁脆,當(dāng)一個進(jìn)程執(zhí)行完畢后會添加新的進(jìn)程進(jìn)去
pool.apply_async(func, (msg,))
pool.close()
pool.join() # 調(diào)用join之前眷蚓,先調(diào)用close函數(shù),否則會出錯反番。執(zhí)行完close后不會有新的進(jìn)程加入到pool,join函數(shù)等待所有子進(jìn)程結(jié)束
'''
輸出結(jié)果:
in: python教程 processes1
in: python教程 processes2
in: python教程 processes3
out, python教程 processes1
in: python教程 processes4
out, python教程 processes2
in: python教程 processes5
out, python教程 processes3
out, python教程 processes4
out, python教程 processes5
'''
代碼分析:
5 個任務(wù)沙热,3 個進(jìn)程,由于在進(jìn)程池構(gòu)造的時候允許同時最多執(zhí)行 3 個進(jìn)程罢缸,所以同時執(zhí)行任務(wù) 1 / 任務(wù) 2 / 任務(wù) 3篙贸,重代碼的輸出結(jié)果來看,任務(wù) 1 / 任務(wù) 2 / 任務(wù) 3 執(zhí)行后枫疆,for 循環(huán)進(jìn)入阻塞狀態(tài)爵川,直到任務(wù) 1 / 任務(wù) 2 / 任務(wù) 3 其中一個結(jié)束之后才會 for 才會繼續(xù)執(zhí)行任務(wù) 4 / 任務(wù) 5,并保證同時執(zhí)行的最多只有 3 個任務(wù)( 進(jìn)程池 multiprocessing.Pool 和 線程池 ThreadPoolExecutor 原理相同).
三.猜你喜歡
- Python 條件推導(dǎo)式
- Python 列表推導(dǎo)式
- Python 字典推導(dǎo)式
- Python 不定長參數(shù) *argc/**kargcs
- Python 匿名函數(shù) lambda
- Python return 邏輯判斷表達(dá)式
- Python is 和 == 區(qū)別
- Python 可變數(shù)據(jù)類型和不可變數(shù)據(jù)類型
- Python 淺拷貝和深拷貝
- Python 異常處理
- Python 線程創(chuàng)建和傳參
- Python 線程互斥鎖 Lock
- Python 線程時間 Event
- Python 線程條件變量 Condition
- Python 線程定時器 Timer
- Python 線程信號量 Semaphore
- Python 線程障礙對象 Barrier
- Python 線程隊列 Queue – FIFO
- Python 線程隊列 LifoQueue – LIFO
- Python 線程優(yōu)先隊列 PriorityQueue
- Python 線程池 ThreadPoolExecutor(一)
- Python 線程池 ThreadPoolExecutor(二)
- Python 進(jìn)程 Process 模塊
- Python 進(jìn)程 Process 與線程 threading 區(qū)別
- Python 進(jìn)程間通信 Queue / Pipe
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? Python 進(jìn)程池 multiprocessing.Pool
本文由博客 - 猿說編程 猿說編程 發(fā)布息楔!