最近中文字幕国语免费完整,中文亚洲无线码49vv,中文无码热在线视频,亚洲自偷自拍熟女另类,中文字幕高清av在线

當(dāng)前位置: 首頁(yè) > 技術(shù)教程

Python中的多進(jìn)程怎么創(chuàng)建? 進(jìn)程間如何共享數(shù)據(jù)?

  在 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)))

python3.png

  二、進(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ù)的能力。

 


猜你喜歡