Python使用多进程执行同一个函数的多种方法

 更新时间:2026年04月15日 09:25:04   作者:独隅  
本文介绍了在Python中使用多进程执行相同函数的三种方法:Process类、Pool进程池和apply_async异步执行,比较了各种方法的适用场景、优缺点,并提供了实用技巧和注意事项,推荐使用Pool进程池处理大量任务,它简单易用且自动负载均衡,需要的朋友可以参考下

在 Python 中,使用多进程执行同一个函数有多种方法,主要可以通过 multiprocessing 模块实现。以下是几种常用的方式:

方法一:使用 Process 类创建独立进程

这种方法适合需要精确控制每个进程的场景。

import multiprocessing
import time

def worker(task_name, duration):
    print(f"进程 {task_name} 开始执行,预计耗时 {duration} 秒")
    time.sleep(duration)
    print(f"进程 {task_name} 执行完成")
    return f"{task_name} 处理结果"

if __name__ == "__main__":
    processes = []
    tasks = [("任务A", 2), ("任务B", 3), ("任务C", 1)]
    
    # 创建并启动多个进程
    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("所有进程执行完毕")

方法二:使用 Pool 进程池(推荐)

进程池更适合处理大量任务,可以自动管理进程的创建和回收。

import multiprocessing
import os

def worker(x):
    print(f"进程 {os.getpid()} 正在处理数据: {x}")
    result = x * x  # 模拟计算任务
    return result

if __name__ == "__main__":
    # 创建进程池,进程数通常设为CPU核心数
    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 实现异步执行

适合需要更灵活控制任务提交和结果获取的场景。

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("所有任务已提交,主进程可继续执行其他工作...")
        
        # 按完成顺序获取结果(无序)
        for result in async_results:
            print(result.get())  # 阻塞直到有结果可用

方法对比与选择指南

方法适用场景优点缺点
Process进程数少,需要精细控制控制灵活,可设置不同参数需要手动管理进程生命周期
Pool.map批量处理相同任务简单易用,自动负载均衡必须等待所有任务完成
Pool.apply_async异步任务处理非阻塞,效率高结果获取稍复杂

实用技巧与注意事项

  1. 进程间通信:使用 Queue 进行数据传递
def worker(queue):
    data = queue.get()
    processed = f"处理后的: {data}"
    queue.put(processed)
  1. 错误处理:使用回调函数处理异常
def error_callback(error):
    print(f"任务执行出错: {error}")

pool.apply_async(worker, args=(data,), error_callback=error_callback)
  1. 性能优化:合理设置进程数和 chunksize
# 根据任务类型调整参数
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)

根据你的具体需求选择合适的方案,Pool 进程池 在大多数情况下都是最实用和高效的选择。

以上就是Python使用多进程执行同一个函数的多种方法的详细内容,更多关于Python多进程执行同一个函数的资料请关注脚本之家其它相关文章!

相关文章

  • python实现横向拼接图片

    python实现横向拼接图片

    这篇文章主要为大家详细介绍了python实现横向拼接图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 使用python来调用CAN通讯的DLL实现方法

    使用python来调用CAN通讯的DLL实现方法

    今天小编就为大家分享一篇使用python来调用CAN通讯的DLL实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python文件名匹配与文件复制的实现

    Python文件名匹配与文件复制的实现

    这篇文章主要介绍了Python文件名匹配与文件复制的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • python实现简易学生信息管理系统

    python实现简易学生信息管理系统

    这篇文章主要为大家详细介绍了python实现简易学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 对python中raw_input()和input()的用法详解

    对python中raw_input()和input()的用法详解

    下面小编就为大家分享一篇对python中raw_input()和input()的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python将字符串转变成dict格式的实现

    python将字符串转变成dict格式的实现

    这篇文章主要介绍了python将字符串转变成dict格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Flask 数据库集成的介绍

    Flask 数据库集成的介绍

    这篇文章主要给大家分享了Flask 数据库集成的介绍,数据库是大多数 Web 应用的基础设施,只要想把数据存储下来,就离不开数据库,下面将一起学习一下如何给 Flask 应用添加数据库支持。下面详细内容,需要的朋友可以参考一下
    2021-11-11
  • Python使用Matplotlib绘制专业柱状图的完整指南

    Python使用Matplotlib绘制专业柱状图的完整指南

    柱状图是数据可视化中最常用的图表类型之一,用于展示分类数据的数值比较,Python的Matplotlib库提供了强大的柱状图绘制功能,下面我们将一步步学习如何创建专业级的柱状图,感兴趣的小伙伴跟着小编一起来看看吧
    2025-07-07
  • python 判断文件还是文件夹的简单实例

    python 判断文件还是文件夹的简单实例

    今天小编就为大家分享一篇python 判断文件还是文件夹的简单实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python_tkinter弹出对话框创建2

    python_tkinter弹出对话框创建2

    这篇文章主要介绍了python_tkinter弹出对话框创建,上以篇文章我们简单的对对话框创建做了简单介绍,本文将继续更多相关内容,需要的小伙伴可以参考一下
    2022-03-03

最新评论