multiprocessing.pool和multiprocessing.Process

在CPU密集型任務中,Python的multiprocessing模塊是突破GIL限制的關鍵工具。multiprocessing.Pool(進程池)和multiprocessing.Process(獨立進程)是最常用的兩種并行化方案,但其設計思想和適用場景截然不同。本文結合代碼示例和性能對比,解析二者的核心差異及最佳實踐。


一、multiprocessing.Process:精細控制單個進程

核心特性

  • 手動管理生命周期:通過start()啟動進程,join()等待結束,適合非均質任務調度。
  • 跨平臺限制:Windows系統需將進程代碼包裹在 if __name__ == '__main__': 中,避免子進程遞歸創建。
  • 進程間通信(IPC):需借助QueuePipe或共享內存(如Value/Array)傳遞數據。

典型代碼結構

from multiprocessing import Processdef worker(num):print(f"Worker {num} running")if __name__ == '__main__':processes = []for i in range(3):p = Process(target=worker, args=(i,))processes.append(p)p.start()  # 啟動進程for p in processes:p.join()   # 阻塞至進程結束

適用場景
? 需要精確控制每個進程的任務邏輯
? 進程執行時間差異大(如實時響應外部事件)
? 復雜IPC需求(如雙向數據流)


二、multiprocessing.Pool:批量任務的自動化調度

核心優勢

  • 進程復用:固定數量的工作進程反復處理任務,避免頻繁創建/銷毀開銷。
  • 任務分發API
    • map(func, iterable):阻塞式,按順序返回結果
    • apply_async(func, args):非阻塞,通過get()異步獲取結果。
  • 資源約束:通過processes參數限制并發數(默認等于CPU核心數)。

基礎用法示例

from multiprocessing import Pool
import timedef task(msg):print(f"Start: {msg}")time.sleep(2)return f"End: {msg}"if __name__ == '__main__':with Pool(processes=3) as pool:   # 限制3個進程results = pool.apply_async(task, ("Hello", ))print(results.get())           # 阻塞等待結果# 批量提交任務multiple_results = [pool.apply_async(task, (i,)) for i in range(4)]print([res.get() for res in multiple_results])

關鍵操作

  1. pool.close():禁止新任務提交
  2. pool.join():等待所有子進程退出

適用場景
? 處理大量同構任務(如數據分塊處理)
? 需要自動負載均衡
? 簡化并行代碼結構


三、Pool vs Process 關鍵差異總結
特性multiprocessing.Poolmultiprocessing.Process
進程管理自動維護進程池,復用工作進程手動創建/銷毀單個進程
任務調度支持map/apply_async等高級分發需自行實現任務分配邏輯
阻塞行為apply為阻塞,apply_async為非阻塞完全依賴join()控制阻塞
內存開銷較低(進程復用)較高(頻繁創建新進程)
適用任務類型均勻任務(如批量計算)異構任務或需實時響應場景

四、性能陷阱與最佳實踐
  1. 避免全局變量拷貝
    Pool的任務函數需可序列化,避免包含大對象(可通過initializer預加載資源):

    def init_pool():global large_data  # 子進程初始化時加載large_data = load_heavy_model()pool = Pool(initializer=init_pool)
    
  2. 進程池不適用復雜IPC
    Pool的任務函數無法直接使用multiprocessing.Queue,需改用Manager().Queue()

    from multiprocessing import Manager
    manager = Manager()
    task_queue = manager.Queue()  # 進程池安全的隊列
    
  3. 超時控制與容錯
    apply_async支持timeout參數,避免僵尸進程:

    result = pool.apply_async(long_task, args=(...))
    try:output = result.get(timeout=30)  # 30秒超時
    except TimeoutError:print("Task timed out")
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86174.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

容器技術技術入門與 Docker 環境部署

目錄 一:Docker概述 1、 Docker的優勢: (1)環境一致性 (2)隔離性 (3)資源高效 (4)便捷性和可擴展性 2、Docker容器與傳統虛擬機的區別 3、Docker的應用…

Oracle獲取執行計劃之DBMS_XPLAN 技術詳解1

在 Oracle 數據庫的管理與優化工作中,深入了解 SQL 語句的執行計劃是至關重要的一環。DBMS_XPLAN 包作為 Oracle 提供的強大工具,能夠幫助數據庫管理員(DBAs)和開發人員清晰地查看和分析 SQL 語句的執行計劃,從而實現對…

【Python】VScode配置Python教程

文章目錄 【Python】VScode配置Python教程下載Python安裝插件解決亂碼徹底運行vscode安裝python庫 【Python】VScode配置Python教程 前言: 當「Python 編程潛力」遇上「VSCode 開發神器」,會點燃怎樣的效率革命?試想這樣的場景:你…

PowerBI HtmlContent生成表格

假設有銷量表: 1.PowerBI 導入 Html Content對象&#xff0c;并拖入報表 2.新建度量值: 度量值 VAR colCount DISTINCTCOUNT(銷量[產品]) VAR ColumnHeaders "<tr><th styleborder:1px solid black; padding:5px; text-align:center; colspan"&col…

【人工智能與機器人研究】基于運動數據時空特征提取的人類運動片段分割方法

導讀 動作示教方法是非專家用戶對人形機器人進行控制的可靠形式&#xff0c;而對人類動作數據的運動分割與理解是其前提。利用現有方法對所捕獲人類運動原始數據進行關鍵幀提取與運動分割時&#xff0c;由于數據特征不明確&#xff0c;導致難以準確定位運動起始幀、結束幀及分…

ARM內核之CMSIS

1.什么是CMSIS&#xff1f; CMSIS&#xff08;Cortex Microcontroller Software Interface Standard&#xff0c;Cortex微控制器軟件接口標準&#xff09;提供Cortex-M內核與軟件之間的接口&#xff0c;即用戶可以通過這些統一的接口&#xff08;函數API&#xff09;去訪問底…

嵌入式軟件面經(二)Q: Modbus協議CRC校驗的方式是什么?它有哪些優勢?

Modbus協議使用的CRC&#xff08;循環冗余校驗&#xff09;是一種用于確保數據通信完整性和準確性的差錯檢測方法。在Modbus RTU通信中&#xff0c;CRC校驗過程清晰明確&#xff0c;且被廣泛應用于工業通信場景。 一、Modbus協議的CRC校驗流程 &#xff08;一&#xff09;CRC計…

glib-object 中G_DEFINE_TYPE 宏都作了什么?

author: hjjdebug date: 2025年 06月 25日 星期三 15:35:26 CST descrip: glib-object 中G_DEFINE_TYPE 宏都作了什么? 文章目錄 1. 測試代碼2 給出它的展開式.3.說說它都生成了什么?3.1. my_foo_get_type() 函數3.2. static GType my_foo_get_type_once(void)3.3. my_foo_cl…

Alembic遷移系統初始化實戰教程

下面是一份結構清晰、步驟明確的 基于 Alembic Pydantic SQLAlchemy 的數據庫遷移系統初始化教程&#xff0c;非常適合初次搭建項目或團隊規范流程參考。 &#x1f680; Alembic SQLAlchemy Pydantic 項目數據庫遷移初始化教程 本教程將指導你如何從零初始化 Alembic 遷移…

灰度發布怎么保證數據庫一致的

注&#xff1a; 以下內容來源于deepseek答案&#xff0c;生產環境以實際情況為主&#xff01; 在灰度發布中保證數據庫一致的最優解需要同時滿足安全性、低復雜度和高可操作性。結合多年實戰經驗&#xff0c;以下是最推薦的黃金方案&#xff08;適用于90%以上場景&#xff09;&…

不用vue,只用html,即可簡單實現electron項目

為你提供一個 最簡單的 Electron 項目模板&#xff0c;包含完整的代碼、配置和打包說明。即使你是小白&#xff0c;也能快速上手。 1. 項目結構 /your-project├── main.js # Electron 主進程文件├── preload.js # 安全通信腳本&#xff08;可選&#xf…

C++11原子操作:從入門到精通

文章目錄 一、什么是原子操作&#xff1f;二、為什么需要原子操作&#xff1f;三、C11中的<atomic>頭文件四、基本使用1. 聲明原子變量2. 基本原子操作 五、內存順序&#xff08;Memory Order&#xff09;示例&#xff1a;使用內存順序實現自旋鎖 六、原子類型模板七、實…

深入解析Flink Local模式啟動流程源碼:揭開作業初始化的神秘面紗

在Flink的數據處理體系中&#xff0c;Local模式憑借無需依賴分布式集群資源的特性&#xff0c;成為開發測試階段快速驗證作業邏輯的利器。其啟動流程的源碼里&#xff0c;藏著從作業提交到任務執行的完整脈絡。接下來&#xff0c;我們將深入關鍵代碼段&#xff0c;逐行剖析Flin…

二刷 蒼穹外賣 day06

HttpClient 用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包 作用&#xff1a; 發送HTTP請求 接受響應數據 應用場景&#xff1a; 當我們在使用掃描支付、查看地圖、獲取驗證碼、查看天氣等功能時 其實&#xff0c;應用程序本身并未實現這些功能&#xff…

React第六十三節Router中BrowserRouter的用途及注意事項

前言 BrowserRouter 是 React Router 庫的核心組件&#xff0c;用于實現單頁面應用&#xff08;SPA&#xff09;的客戶端路由。它利用 HTML5 History API 管理 URL&#xff0c;實現頁面無刷新跳轉。下面詳細解釋其用途、使用方法和代碼示例&#xff1a; 一、BrowserRouter 核…

《Self-Adapting Language Models》(SEAL)代碼閱讀筆記

代碼&#xff1a;https://github.com/Continual-Intelligence 腳本命令用法&#xff1a;knowledge-incorporation/README.md 生成self-edit數據 腳本&#xff1a;sbatch knowledge-incorporation/scripts/make_squad_data.sh vllm serve啟動Qwen2.5-7B模型的服務。 執行self-e…

GelSight Mini視觸覺傳感器開發資源升級:觸覺3D點云+ROS2助力機器人科研與醫療等應用

近日&#xff0c;GelSight宣布對其GelSight Mini視觸覺傳感器的GitHub支持頁面進行重大更新&#xff0c;圍繞3D點云重建、ROS2 集成及開發者支持體系推出三大核心升級&#xff0c;助力機器人觸覺感知、工業檢測及科研場景落地。 GelSight Mini視觸覺傳感器重磅發布&#xff01;…

6、做中學 | 三年級下期 Golang值類型相互轉換

本次為操作文章&#xff0c;大部分都在討論類型之間如何轉換&#xff0c;使用的是內置方法進行調用執行&#xff0c;詳細使用請移步至&#xff1a; go的API使用文檔地址 https://studygolang.com/pkgdoc 一、數值類型相互轉換 go中數值轉換需要顯示轉換&#xff0c;不能隱式自…

019 高校心理教育輔導系統技術解析:構建心理健康守護平臺

高校心理教育輔導系統技術解析&#xff1a;構建心理健康守護平臺 在關注大學生心理健康成為教育重點的當下&#xff0c;高校心理教育輔導系統借助數字化技術整合多種功能模塊&#xff0c;面向管理員、學生、教師三類角色&#xff0c;實現心理教育輔導工作的高效化與精準化。本…

【ArcGIS】土地資源單項評價

【ArcGIS】土地資源單項評價 一、土地資源單項評價1、評價思路 二、操作步驟1、處理環境設置2、地形坡度評價3、高程評價4、坡度高程疊加評價5、地形起伏度6、土地資源綜合評價 一、土地資源單項評價 1、評價思路 &#xff08;1&#xff09;利用全域DEM計算地形坡度&#xff…