最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用多進(jìn)程執(zhí)行同一個(gè)函數(shù)的多種方法

 更新時(shí)間:2026年04月15日 09:25:04   作者:獨(dú)隅  
本文介紹了在Python中使用多進(jìn)程執(zhí)行相同函數(shù)的三種方法:Process類(lèi)、Pool進(jìn)程池和apply_async異步執(zhí)行,比較了各種方法的適用場(chǎng)景、優(yōu)缺點(diǎn),并提供了實(shí)用技巧和注意事項(xiàng),推薦使用Pool進(jìn)程池處理大量任務(wù),它簡(jiǎn)單易用且自動(dòng)負(fù)載均衡,需要的朋友可以參考下

在 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)

  1. 進(jìn)程間通信:使用 Queue 進(jìn)行數(shù)據(jù)傳遞
def worker(queue):
    data = queue.get()
    processed = f"處理后的: {data}"
    queue.put(processed)
  1. 錯(cuò)誤處理:使用回調(diào)函數(shù)處理異常
def error_callback(error):
    print(f"任務(wù)執(zhí)行出錯(cuò): {error}")

pool.apply_async(worker, args=(data,), error_callback=error_callback)
  1. 性能優(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實(shí)現(xiàn)橫向拼接圖片

    python實(shí)現(xiàn)橫向拼接圖片

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)橫向拼接圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 使用python來(lái)調(diào)用CAN通訊的DLL實(shí)現(xià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)

    這篇文章主要介紹了Python文件名匹配與文件復(fù)制的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • python實(shí)現(xiàn)簡(jiǎn)易學(xué)生信息管理系統(tǒng)

    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()的用法詳解

    下面小編就為大家分享一篇對(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)

    這篇文章主要介紹了python將字符串轉(zhuǎn)變成dict格式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Flask 數(shù)據(jù)庫(kù)集成的介紹

    Flask 數(shù)據(jù)庫(kù)集成的介紹

    這篇文章主要給大家分享了Flask 數(shù)據(jù)庫(kù)集成的介紹,數(shù)據(jù)庫(kù)是大多數(shù) Web 應(yīng)用的基礎(chǔ)設(shè)施,只要想把數(shù)據(jù)存儲(chǔ)下來(lái),就離不開(kāi)數(shù)據(jù)庫(kù),下面將一起學(xué)習(xí)一下如何給 Flask 應(yīng)用添加數(shù)據(jù)庫(kù)支持。下面詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • Python使用Matplotlib繪制專(zhuān)業(yè)柱狀圖的完整指南

    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í)例

    今天小編就為大家分享一篇python 判斷文件還是文件夾的簡(jiǎn)單實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • python_tkinter彈出對(duì)話框創(chuàng)建2

    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

最新評(píng)論

普洱| 鄂伦春自治旗| 蚌埠市| 西乌| 进贤县| 宁远县| 枝江市| 仙桃市| 卫辉市| 仙游县| 驻马店市| 八宿县| 叶城县| 犍为县| 寿光市| 巨鹿县| 阳东县| 临猗县| 鹤壁市| 尉犁县| 板桥市| 衡东县| 鸡西市| 封开县| 昌吉市| 夏河县| 逊克县| 鱼台县| 桓仁| 科技| 卢湾区| 宁武县| 余庆县| 普宁市| 阳谷县| 慈溪市| 平阳县| 澄江县| 湖南省| 河池市| 集贤县|