在 Python 中,GIL(全局解釋器鎖)導(dǎo)致單進(jìn)程無(wú)法充分利用多核 CPU,而多進(jìn)程通過獨(dú)立內(nèi)存空間與解釋器,可突破此限制,高效處理數(shù)據(jù)計(jì)算、模型訓(xùn)練等 CPU 密集型任務(wù)。本文將簡(jiǎn)述多進(jìn)程創(chuàng)建的三種核心方法,及進(jìn)程間數(shù)據(jù)共享的實(shí)用方案。
一、Python 多進(jìn)程的創(chuàng)建方法
Python 通過multiprocessing庫(kù)與concurrent.futures模塊實(shí)現(xiàn)多進(jìn)程,三種方式覆蓋不同場(chǎng)景需求。
(一)Process類:創(chuàng)建單個(gè)進(jìn)程
適用于任務(wù)數(shù)量少的場(chǎng)景,通過實(shí)例化Process指定目標(biāo)函數(shù)與參數(shù),調(diào)用start()啟動(dòng),join()等待結(jié)束。Windows 系統(tǒng)需在if __name__ == "__main__":下執(zhí)行,避免進(jìn)程重復(fù)創(chuàng)建。
示例核心代碼:
TypeScript取消自動(dòng)換行復(fù)制
import multiprocessing
def task(num):
print(f"進(jìn)程任務(wù):{num}")
if __name__ == "__main__":
p = multiprocessing.Process(target=task, args=(1,))
p.start()
p.join()
(二)Pool類:進(jìn)程池批量處理
任務(wù)量大時(shí),Pool預(yù)先創(chuàng)建固定數(shù)量進(jìn)程(默認(rèn)等于 CPU 核心數(shù)),循環(huán)復(fù)用減少資源消耗。通過apply_async()異步提交任務(wù),close()關(guān)閉池后用join()等待結(jié)果。
示例核心代碼:
TypeScript取消自動(dòng)換行復(fù)制
pool = multiprocessing.Pool(processes=4)
tasks = range(1, 11)
results = [pool.apply_async(task, (n,)) for n in tasks]
pool.close()
pool.join()
final = [r.get() for r in results]
(三)ProcessPoolExecutor:簡(jiǎn)潔管理(推薦)
Python 3.2 + 引入的ProcessPoolExecutor封裝底層細(xì)節(jié),支持with語(yǔ)句自動(dòng)管理池生命周期,map()批量獲取結(jié)果,代碼更簡(jiǎn)潔。
示例核心代碼:
TypeScript取消自動(dòng)換行復(fù)制
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor(max_workers=4) as executor:
results = list(executor.map(task, range(1, 11)))
二、進(jìn)程間數(shù)據(jù)共享方案
進(jìn)程內(nèi)存隔離,需通過專門機(jī)制實(shí)現(xiàn)數(shù)據(jù)交互,三種方案各有適用場(chǎng)景。
(一)隊(duì)列(Queue):安全的多對(duì)多通信
基于消息傳遞,支持多進(jìn)程并發(fā)讀寫,自動(dòng)處理同步,適合 “生產(chǎn)者 - 消費(fèi)者” 場(chǎng)景。put()添加數(shù)據(jù),get()獲取數(shù)據(jù),避免數(shù)據(jù)競(jìng)爭(zhēng)。
示例核心代碼:
TypeScript取消自動(dòng)換行復(fù)制
queue = multiprocessing.Queue()
# 生產(chǎn)者
p1 = multiprocessing.Process(target=produce, args=(queue,))
# 消費(fèi)者
p2 = multiprocessing.Process(target=consume, args=(queue,))
(二)管道(Pipe):高效的一對(duì)一通信
創(chuàng)建兩個(gè)連接對(duì)象實(shí)現(xiàn)雙向通信,速度比隊(duì)列快,但僅支持兩個(gè)進(jìn)程交互。send()發(fā)送數(shù)據(jù),recv()接收數(shù)據(jù),適合簡(jiǎn)單雙向通信。
示例核心代碼:
TypeScript取消自動(dòng)換行復(fù)制
conn_a, conn_b = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=process_a, args=(conn_a,))
p2 = multiprocessing.Process(target=process_b, args=(conn_b,))
(三)共享內(nèi)存(Value/Array):高效共享簡(jiǎn)單數(shù)據(jù)
Value共享單個(gè)值(如計(jì)數(shù)器),Array共享數(shù)組,基于操作系統(tǒng)共享內(nèi)存機(jī)制,效率最高。需用Lock加鎖避免多進(jìn)程同時(shí)修改導(dǎo)致的數(shù)據(jù)競(jìng)爭(zhēng)。
示例核心代碼:
TypeScript取消自動(dòng)換行復(fù)制
counter = multiprocessing.Value('i', 0)
lock = multiprocessing.Lock()
p = multiprocessing.Process(target=increment, args=(counter, lock))
def increment(counter, lock):
with lock:
counter.value += 1
多進(jìn)程創(chuàng)建需根據(jù)任務(wù)數(shù)量選擇:?jiǎn)芜M(jìn)程用Process,批量任務(wù)用Pool或ProcessPoolExecutor(推薦)。數(shù)據(jù)共享中,隊(duì)列安全、管道高效、共享內(nèi)存適合簡(jiǎn)單數(shù)據(jù),實(shí)際開發(fā)需結(jié)合場(chǎng)景選擇,確保兼顧效率與安全性。掌握這些方法,可充分發(fā)揮多核 CPU 優(yōu)勢(shì),提升 Python 處理 CPU 密集型任務(wù)的能力。