python多進程的使用

多進程編程全面指南:從入門到實踐

摘要:本文是為初學者設計的Python多進程編程全攻略,涵蓋基礎概念、核心函數詳解、系統特性分析,并附帶流程圖、測試用例、開源項目推薦和經典書籍清單。通過8個實戰代碼示例和3個性能對比實驗,幫你避開常見陷阱,快速掌握進程級并行計算。


一、多進程基礎概念圖解

1.1 進程 vs 線程

程序
進程
線程
獨立內存空間
系統調度
共享進程內存
輕量級
特性進程線程
隔離性完全獨立共享內存
創建開銷大(需復制資源)
通信方式管道/隊列/共享內存直接內存訪問
崩潰影響不影響其他進程導致進程終止

1.2 何時選擇多進程?

  • CPU密集型任務(如圖像處理)
  • 需要突破GIL限制
  • 要求更高穩定性(進程崩潰互不影響)

二、Python多進程核心API詳解

2.1 Process類參數解剖

from multiprocessing import Processdef worker(name, count):print(f"{name} processed {count} items")if __name__ == '__main__':p = Process(target=worker,      # 必選:目標函數name="Worker1",     # 進程名稱(調試用)args=("A", 100),    # 位置參數元組kwargs={'count':50},# 關鍵字參數字典daemon=True         # 是否設為守護進程)p.start()

關鍵參數說明

  • daemon:父進程退出時自動終止子進程
  • name:通過ps -ef可查看的進程標識
  • args:注意單元素元組要加逗號(x,)

2.2 跨進程通信三劍客

1. Queue隊列(線程安全)
from multiprocessing import Queue
q = Queue(maxsize=10)  # 緩沖區大小
q.put(obj, block=False) # 非阻塞模式
2. Pipe管道(雙向通信)
parent_conn, child_conn = Pipe(duplex=True)
child_conn.send(obj)  # 發送可序列化對象
3. SharedMemory(Python3.8+)
from multiprocessing import shared_memory
shm = shared_memory.SharedMemory(name='shm1', create=True, size=1024)

三、五大實戰場景與性能測試

3.1 基礎創建測試(benchmark.py)

import time
from multiprocessing import Processdef cpu_bound(n):return sum(i*i for i in range(n))if __name__ == '__main__':sizes = [10**6, 5*10**6]for n in sizes:# 單進程版start = time.time()[cpu_bound(n) for _ in range(4)]print(f"Sequential: {time.time()-start:.2f}s")# 多進程版start = time.time()procs = [Process(target=cpu_bound, args=(n,)) for _ in range(4)][p.start() for p in procs][p.join() for p in procs]print(f"Parallel: {time.time()-start:.2f}s")

測試結果(4核CPU)

數據規模串行執行4進程并行加速比
1,000,0001.82s0.63s2.89x
5,000,0009.15s2.91s3.14x

四、系統級特性與注意事項

4.1 Unix vs Windows差異

特性Unix系Windows
進程創建fork()快速復制重新導入解釋器
全局變量子進程繼承不繼承
序列化要求較寬松必須可pickle

4.2 常見陷阱解決方案

  1. 僵尸進程預防

    import signal
    signal.signal(signal.SIGCHLD, signal.SIG_IGN)
    
  2. 日志沖突處理

    from multiprocessing import get_logger
    logger = get_logger()
    logger.addHandler(logging.FileHandler('mp.log'))
    
  3. 平臺兼容寫法

    if __name__ == '__main__':  # Windows必須加freeze_support()       # PyInstaller打包需要
    

五、生態資源推薦

5.1 經典開源項目

  1. Celery:分布式任務隊列(支持進程級并發)

    pip install celery
    
  2. Dask:并行計算庫(智能任務調度)

    from dask import delayed
    results = [delayed(process)(x) for x in data]
    
  3. Ray:高性能分布式執行框架

    @ray.remote
    def parallel_task(x):return x**2
    

5.2 推薦書單

  • 《Python并行編程手冊》- 王永祥
  • 《High Performance Python》2nd Edition - Micha Gorelick
  • 《Multiprocessing with Python》- Dusty Phillips

六、完整示例:圖片處理流水線

# image_pipeline.py
from PIL import Image
from multiprocessing import Pooldef process_image(path):img = Image.open(path)return img.filter(ImageFilter.GaussianBlur(2))if __name__ == '__main__':with Pool(processes=4) as pool:results = pool.map(process_image, glob.glob('*.jpg'))

優化技巧

  • 使用imap_unordered獲取即時結果
  • 設置chunksize減少IPC開銷
  • 配合ThreadPool處理IO密集型階段

結語:多進程編程像樂高積木——正確組合基礎模塊能構建高性能系統。記住:1)隔離性是優勢也是成本 2)IPC開銷決定擴展性 3)根據任務類型選擇并發模型。現在嘗試用concurrent.futures.ProcessPoolExecutor重構一個你的舊腳本吧!

下一步學習

  • 進程池的負載均衡策略
  • 與asyncio的混合使用
  • 使用multiprocessing.Manager實現高級共享狀態

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

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

相關文章

數據庫管理與安全:從用戶權限到備份恢復的全面指南

引言 在數字化時代,數據已成為組織最寶貴的資產之一。數據庫作為存儲和管理這些數據的核心系統,其安全性和可靠性直接關系到企業的運營和發展。無論是金融交易記錄、醫療健康信息,還是電子商務平臺的用戶數據,都需要通過完善的數…

Electron Forge【實戰】帶圖片的 AI 聊天

改用支持圖片的 AI 模型 qwen-turbo 僅支持文字,要想體驗圖片聊天,需改用 qwen-vl-plus src/initData.ts {id: 2,name: "aliyun",title: "阿里 -- 通義千問",desc: "阿里百煉 -- 通義千問",// https://help.aliyun.com/z…

在 Elastic 中使用 JOIN 進行威脅狩獵!

作者:來自 Elastic Paul Ewing, Jonhnathan Ribeiro Elastic 的管道查詢語言 ES | QL 為查詢帶來了 join 功能。 威脅狩獵者歡呼吧!你是否一直在尋找一種通過 Elastic 的速度和強大功能來連接數據的方法?好消息!Elastic 現在可以通…

從實列中學習linux shell5: 利用shell 腳本 檢測硬盤空間容量,當使用量達到80%的時候 發送郵件

下面是用于檢測硬盤空間并在使用量達到80%時發送郵件的Shell腳本 第一步 編寫腳本 #!/bin/bash# 郵件配置 recipient"zhaoqingyou99qhzt.com" subject"磁盤空間警報" mail_cmd"/usr/bin/mail" # 根據實際郵件命令路徑修改# 檢查是否安裝郵件工…

Ethan獨立開發產品日報 | 2025-04-30

1. Daytona 安全且靈活的基礎設施,用于運行你的人工智能生成代碼。 Daytona Cloud重新定義了AI代理的基礎設施,具備低于90毫秒的啟動時間、原生性能和有狀態執行能力,這些是傳統云服務無法比擬的。您可以以前所未有的速度和靈活性來創建、管…

Unity SpriteMask(精靈遮罩)

🏆 個人愚見,沒事寫寫筆記 🏆《博客內容》:Unity3D開發內容 🏆🎉歡迎 👍點贊?評論?收藏 🔎SpriteMask:精靈遮罩 💡作用就是對精靈圖片產生遮罩&#xff0c…

OpenHarmony全局資源調度管控子系統之內存管理部件

OpenHarmony之內存管理部件 內存管理部件 簡介目錄框架 進程回收優先級列表 補充 回收策略/查殺策略 使用說明參數配置說明 availbufferSizeZswapdParamkillConfignandlife 相關倉 簡介 內存管理部件位于全局資源調度管控子系統中,基于應用的生命周期狀態&#…

姜老師的MBTI課程筆記小結(1)ENFJ人格

課程文稿: 好,今天我們的重點其實并不在ENTJ,而是在于如果一個人其他都很像,只是在思考和感受這兩端選擇的時候,他缺了思考而更尊重感受,它會是什么樣的一個人格特質呢?這就是ENFG在16人格的學派…

Node.js 應用場景

Node.js 應用場景 引言 Node.js 是一個基于 Chrome V8 JavaScript 引擎的開源、跨平臺 JavaScript 運行環境。它主要用于服務器端開發,通過非阻塞 I/O 模型實現了高并發處理能力。本文將詳細介紹 Node.js 的應用場景,幫助你了解其在實際項目中的應用。…

Qt/C++面試【速通筆記六】—Qt 中的線程同步

在多線程編程中,多個線程同時訪問共享資源時,可能會出現數據不一致或者錯誤的情況。這時,我們需要線程同步機制來保證程序的正確性。Qt 提供了多種線程同步方式,每種方式適用于不同的場景。 1. 互斥鎖(QMutex&#xff…

JDK-17 保姆級安裝教程(附安裝包)

文章目錄 一、下載二、安裝三、驗證是否安裝成功1、看 java 和 javac 是否可用2、看 java 和 javac 的版本號是否無問題 一、下載 JDK-17_windows-x64_bin.exe 二、安裝 三、驗證是否安裝成功 java:執行工具 javac:編譯工具 1、看 java 和 javac 是否…

【LeetCode Hot100】回溯篇

前言 本文用于整理LeetCode Hot100中題目解答,因題目比較簡單且更多是為了面試快速寫出正確思路,只做簡單題意解讀和一句話題解方便記憶。但代碼會全部給出,方便大家整理代碼思路。 46. 全排列 一句話題意 給定一個無重復數字的序列&#xf…

pytest-前后置及fixture運用

1.pytest中的xunit風格前后置處理 pytest中用例的前后置可以直接使用類似于unittest中的前后置處理,但是pytest中的前后置處理方式更 加豐富,分為模塊級、類級、方法級、函數級等不同等級的前后置處理,具體見下面的代碼: test_…

使用scipy求解優化問題

一、求解二次規劃問題 min(X.T * P * X C.T * X) s.t. Xi > 0 ∑Xi 1 1.定義目標函數 def objective(x):return 0.5 * np.dot(x, np.dot(P, x)) np.dot(c, x)2. 定義等式約束 def equality_constraint(x):return np.sum(x) - 1 3.定義邊界約束:x # …

C++初階-STL簡介

目錄 1.什么是STL 2.STL的版本 3.STL的六大組件 4.STL的重要性 4.1在筆試中 4.2在面試中 4.3.在公司中 5.如何學習STL 6.總結和之后的規劃 1.什么是STL STL(standard template library-標準模板庫);是C標準庫的重要組成部分&#xf…

kivy android打包buildozer.spec GUI配置

這個適合剛剛學習kivyd的道友使用,后面看情況更新 代碼 import tkinter as tk from tkinter import ttk, filedialog, messagebox, simpledialog import configparser import os import json # 新增導入class BuildozerConfigTool:def __init__(self, master):se…

MOOS-ivp使用(一)——水下機器人系統的入門與使用

MOOS-ivp使用(一)——水下機器人系統的入門與使用 MOOS-ivp(Marine Operational Oceanographic System for Intelligent Vehicle Planning)是專為水下機器人(如AUV)設計的開源框架。類似于ROS,…

電子病歷高質量語料庫構建方法與架構項目(智能質控體系建設篇)

引言 隨著人工智能技術的迅猛發展,醫療信息化建設正經歷著前所未有的變革。電子病歷作為醫療機構的核心數據資產,其質量直接關系到臨床決策的準確性和醫療安全。傳統的病歷質控工作主要依賴人工審核,存在效率低下、主觀性強、覆蓋面有限等問題。近年來,基于人工智能技術的…

react學習筆記4——React UI組件庫與redux

流行的開源React UI組件庫 material-ui(國外) 官網: http://www.material-ui.com/#/github: GitHub - mui/material-ui: Material UI: Comprehensive React component library that implements Googles Material Design. Free forever. ant-design(國內螞蟻金服) 官網: Ant…