Python多進程、多線程、協(xié)程典型示例解析(最新推薦)
一、multiprocessing(多進程)
1. 模塊簡介
- 作用:創(chuàng)建多個獨立運行的進程(每個進程有獨立內(nèi)存空間)
- 適用場景:數(shù)學計算、圖像處理等CPU密集型任務(wù)
- 核心原理:繞過Python的GIL鎖,真正利用多核CPU
2. 案例詳解:并行計算平方和
import multiprocessing import time # 計算平方的任務(wù)函數(shù) def calculate_square(number): total = 0 for n in range(number): total += n ** 2 print(f"計算結(jié)果:{total}") if __name__ == "__main__": # 必須加這句,否則Windows系統(tǒng)會報錯 # 創(chuàng)建4個進程 processes = [] numbers = [10_000_000, 10_000_000, 10_000_000, 10_000_000] # 四個大數(shù) # 記錄開始時間 start_time = time.time() # 創(chuàng)建并啟動進程 for num in numbers: p = multiprocessing.Process(target=calculate_square, args=(num,)) processes.append(p) p.start() # 啟動進程(會立即返回,不會等待完成) # 等待所有進程完成 for p in processes: p.join() # 阻塞主進程,直到子進程結(jié)束 # 計算總耗時 print(f"總耗時:{time.time() - start_time:.2f}秒")
3. 實現(xiàn)邏輯
主進程(老板)
│
├─ 子進程1(員工1)→ 獨立計算
├─ 子進程2(員工2)→ 獨立計算
├─ 子進程3(員工3)→ 獨立計算
└─ 子進程4(員工4)→ 獨立計算
4. 注意事項
- 進程間不能直接共享變量,需使用
Queue
或Pipe
通信 - 每個進程消耗更多內(nèi)存(獨立內(nèi)存空間)
- 適合處理相互獨立的任務(wù)(如同時處理多個文件)
二、threading(多線程)
1. 模塊簡介
- 作用:創(chuàng)建多個線程(共享同一進程內(nèi)存)
- 適用場景:文件讀寫、網(wǎng)絡(luò)請求等I/O等待型任務(wù)
- 核心特點:受GIL限制,同一時刻只能有一個線程執(zhí)行Python字節(jié)碼
2. 案例詳解:同時下載文件與顯示進度條
import threading import time import requests # 全局變量(線程共享) download_complete = False def download_file(url): global download_complete print("開始下載文件...") response = requests.get(url) with open("bigfile.iso", "wb") as f: f.write(response.content) download_complete = True print("\n下載完成!") def show_progress(): while not download_complete: print(".", end="", flush=True) # 不換行輸出點 time.sleep(0.5) if __name__ == "__main__": # 創(chuàng)建兩個線程 download_thread = threading.Thread( target=download_file, args=("https://example.com/large-file.iso",) ) progress_thread = threading.Thread(target=show_progress) # 啟動線程 download_thread.start() progress_thread.start() # 等待下載線程完成 download_thread.join() progress_thread.join() # 需要手動停止進度條線程
3. 實現(xiàn)邏輯
主線程
│
├─ 下載線程 → 執(zhí)行下載(遇到網(wǎng)絡(luò)等待時,GIL釋放)
└─ 進度條線程 → 打印進度點
4. 注意事項
- 共享變量需使用
Lock
避免數(shù)據(jù)競爭 - 線程適合需要頻繁共享數(shù)據(jù)的場景(如GUI程序)
- 不要用多線程做數(shù)學計算(反而會更慢)
三、asyncio(協(xié)程)
1. 模塊簡介
- 作用:單線程內(nèi)通過任務(wù)切換實現(xiàn)高并發(fā)
- 適用場景:Web服務(wù)器、高頻I/O操作(如爬蟲)
- 核心機制:事件循環(huán)(Event Loop)驅(qū)動協(xié)程切換
2. 案例詳解:異步批量請求網(wǎng)頁
import asyncio import aiohttp # 需要安裝:pip install aiohttp async def fetch_page(url): async with aiohttp.ClientSession() as session: # 創(chuàng)建會話 async with session.get(url) as response: # 發(fā)起請求 return await response.text() # 異步等待響應 async def main(): urls = [ "https://www.baidu.com", "https://www.taobao.com", "https://www.jd.com" ] # 創(chuàng)建任務(wù)列表 tasks = [fetch_page(url) for url in urls] # 并行執(zhí)行所有任務(wù) pages = await asyncio.gather(*tasks) # 關(guān)鍵點:聚集任務(wù) # 輸出結(jié)果 for url, content in zip(urls, pages): print(f"{url} → 長度:{len(content)}") # 啟動事件循環(huán) asyncio.run(main()) # Python 3.7+
3. 實現(xiàn)邏輯
事件循環(huán)(總調(diào)度員)
│
├─ 任務(wù)1:請求百度 → 遇到等待 → 掛起
├─ 任務(wù)2:請求淘寶 → 遇到等待 → 掛起
└─ 任務(wù)3:請求京東 → 遇到等待 → 掛起
當某個請求返回時,恢復對應任務(wù)執(zhí)行
4. 注意事項
- 協(xié)程函數(shù)必須用
async def
定義 - 阻塞操作必須用
await
(否則會阻塞整個事件循環(huán)) - 需要配合異步庫使用(如
aiohttp
代替requests
)
三者的核心區(qū)別總結(jié)
特性 | multiprocessing | threading | asyncio |
---|---|---|---|
并行能力 | 真正多核并行 | 偽并行(受GIL限制) | 單線程并發(fā) |
內(nèi)存占用 | 高(獨立內(nèi)存空間) | 低(共享內(nèi)存) | 最低 |
適用場景 | CPU密集型任務(wù) | I/O密集型任務(wù) | 超高并發(fā)I/O任務(wù) |
代碼復雜度 | 中等(需處理進程通信) | 低(但需處理鎖) | 高(需理解異步語法) |
如何選擇?
- 需要數(shù)學計算加速 → 選
multiprocessing
- 簡單I/O操作(如文件讀寫) → 選
threading
- 高性能網(wǎng)絡(luò)請求(如爬蟲) → 選
asyncio
- 混合型任務(wù) → 組合使用(如多進程+協(xié)程)
通過這三個案例,可以明顯看出:多進程像多個獨立工廠,多線程像工廠內(nèi)多個協(xié)作工人,協(xié)程則像一個人用超高效的時間管理法。理解這個核心差異后,就能根據(jù)實際需求選擇合適的工具了。
到此這篇關(guān)于Python多進程、多線程、協(xié)程典型示例解析的文章就介紹到這了,更多相關(guān)Python多進程、多線程、協(xié)程典型示例解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)據(jù)結(jié)構(gòu)之Array用法實例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)之Array用法實例,較為詳細的講述了Array的常見用法,具有很好的參考借鑒價值,需要的朋友可以參考下2014-10-10python教程之用py2exe將PY文件轉(zhuǎn)成EXE文件
py2exe是一個將python腳本轉(zhuǎn)換成windows上的可獨立執(zhí)行的可執(zhí)行程序(*.exe)的工具,這樣,你就可以不用裝python而在windows系統(tǒng)上運行這個可執(zhí)行程序。2014-06-06Python HTMLTestRunner可視化報告實現(xiàn)過程解析
這篇文章主要介紹了Python HTMLTestRunner可視化報告實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04