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

