Python使用多進程執(zhí)行同一個函數(shù)的多種方法
在 Python 中,使用多進程執(zhí)行同一個函數(shù)有多種方法,主要可以通過 multiprocessing 模塊實現(xiàn)。以下是幾種常用的方式:
方法一:使用 Process 類創(chuàng)建獨立進程
這種方法適合需要精確控制每個進程的場景。
import multiprocessing
import time
def worker(task_name, duration):
print(f"進程 {task_name} 開始執(zhí)行,預計耗時 {duration} 秒")
time.sleep(duration)
print(f"進程 {task_name} 執(zhí)行完成")
return f"{task_name} 處理結果"
if __name__ == "__main__":
processes = []
tasks = [("任務A", 2), ("任務B", 3), ("任務C", 1)]
# 創(chuàng)建并啟動多個進程
for name, duration in tasks:
p = multiprocessing.Process(target=worker, args=(name, duration))
processes.append(p)
p.start()
print(f"已啟動進程: {name}")
# 等待所有進程完成
for p in processes:
p.join()
print("所有進程執(zhí)行完畢")
方法二:使用 Pool 進程池(推薦)
進程池更適合處理大量任務,可以自動管理進程的創(chuàng)建和回收。
import multiprocessing
import os
def worker(x):
print(f"進程 {os.getpid()} 正在處理數(shù)據(jù): {x}")
result = x * x # 模擬計算任務
return result
if __name__ == "__main__":
# 創(chuàng)建進程池,進程數(shù)通常設為CPU核心數(shù)
with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:
data = [1, 2, 3, 4, 5, 6, 7, 8]
# 方法1: map - 阻塞式,按順序返回結果
results = pool.map(worker, data)
print(f"map 結果: {results}")
# 方法2: map_async - 非阻塞式
async_result = pool.map_async(worker, data)
results_async = async_result.get() # 獲取結果時會阻塞
print(f"map_async 結果: {results_async}")
方法三:使用 apply_async 實現(xiàn)異步執(zhí)行
適合需要更靈活控制任務提交和結果獲取的場景。
import multiprocessing
import time
import random
def worker(task_id):
sleep_time = random.uniform(0.5, 2.0)
time.sleep(sleep_time)
return f"任務{task_id} 完成,耗時{sleep_time:.2f}秒"
if __name__ == "__main__":
with multiprocessing.Pool(4) as pool:
# 提交多個異步任務
async_results = []
for i in range(6):
result = pool.apply_async(worker, args=(i,))
async_results.append(result)
print("所有任務已提交,主進程可繼續(xù)執(zhí)行其他工作...")
# 按完成順序獲取結果(無序)
for result in async_results:
print(result.get()) # 阻塞直到有結果可用
方法對比與選擇指南
| 方法 | 適用場景 | 優(yōu)點 | 缺點 |
|---|---|---|---|
| Process | 進程數(shù)少,需要精細控制 | 控制靈活,可設置不同參數(shù) | 需要手動管理進程生命周期 |
| Pool.map | 批量處理相同任務 | 簡單易用,自動負載均衡 | 必須等待所有任務完成 |
| Pool.apply_async | 異步任務處理 | 非阻塞,效率高 | 結果獲取稍復雜 |
實用技巧與注意事項
- 進程間通信:使用
Queue進行數(shù)據(jù)傳遞
def worker(queue):
data = queue.get()
processed = f"處理后的: {data}"
queue.put(processed)
- 錯誤處理:使用回調函數(shù)處理異常
def error_callback(error):
print(f"任務執(zhí)行出錯: {error}")
pool.apply_async(worker, args=(data,), error_callback=error_callback)
- 性能優(yōu)化:合理設置進程數(shù)和 chunksize
# 根據(jù)任務類型調整參數(shù) results = pool.map(worker, data, chunksize=len(data)//multiprocessing.cpu_count())
實際應用示例:并行下載任務
import multiprocessing
import requests
def download_url(url):
try:
response = requests.get(url, timeout=10)
return f"{url}: 成功, 大小 {len(response.content)} bytes"
except Exception as e:
return f"{url}: 失敗, 錯誤 {str(e)}"
if __name__ == "__main__":
urls = [
"https://httpbin.org/delay/1",
"https://httpbin.org/delay/2",
"https://httpbin.org/delay/1"
]
with multiprocessing.Pool(3) as pool:
results = pool.map(download_url, urls)
for result in results:
print(result)
根據(jù)你的具體需求選擇合適的方案,Pool 進程池 在大多數(shù)情況下都是最實用和高效的選擇。
以上就是Python使用多進程執(zhí)行同一個函數(shù)的多種方法的詳細內(nèi)容,更多關于Python多進程執(zhí)行同一個函數(shù)的資料請關注腳本之家其它相關文章!
相關文章
使用python來調用CAN通訊的DLL實現(xiàn)方法
今天小編就為大家分享一篇使用python來調用CAN通訊的DLL實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
python實現(xiàn)簡易學生信息管理系統(tǒng)
這篇文章主要為大家詳細介紹了python實現(xiàn)簡易學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09
對python中raw_input()和input()的用法詳解
下面小編就為大家分享一篇對python中raw_input()和input()的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
Python使用Matplotlib繪制專業(yè)柱狀圖的完整指南
柱狀圖是數(shù)據(jù)可視化中最常用的圖表類型之一,用于展示分類數(shù)據(jù)的數(shù)值比較,Python的Matplotlib庫提供了強大的柱狀圖繪制功能,下面我們將一步步學習如何創(chuàng)建專業(yè)級的柱狀圖,感興趣的小伙伴跟著小編一起來看看吧2025-07-07
python_tkinter彈出對話框創(chuàng)建2
這篇文章主要介紹了python_tkinter彈出對話框創(chuàng)建,上以篇文章我們簡單的對對話框創(chuàng)建做了簡單介紹,本文將繼續(xù)更多相關內(nèi)容,需要的小伙伴可以參考一下2022-03-03

