当前位置:首页>python>Python基础篇 - 多进程-进程池

Python基础篇 - 多进程-进程池

  • 2026-09-02 19:03:06
Python基础篇 - 多进程-进程池
进程池

在上次的文章Python基础篇 - 多进程-进程的创建我们认识了创建多进程的两种基本方式。而当我们需要大量进程的任务,手动实例化一个个进程未免太过繁琐,进程池就能很好地解决这个问题,进程池可以维护大量的进程。 

一. apply()-进程池同步提交单个任务(效率低)

  核心定义:向进程池提交单个任务,同步执行,提交任务后,主进程会等待该任务执行完毕,才能提交下一个任务,相当于排队做任务。

  特点:无需手动获取结果(直接返回任务结果),但执行效率低,无法发挥进程池的并行优势,几乎不用在实际开发中。

# apply():同步执行,没有发挥多进程的优势from multiprocessing import Poolimport osimport time# 定义任务函数(模拟任务执行耗时)def task(num):    time.sleep(1)  # 模拟任务耗时1秒    print(f"任务{num}执行中,进程ID:{os.getpid()}")    return f"任务{num}执行完毕(进程ID:{os.getpid()})"if __name__ == "__main__":    # 实例化进程池(设参数processes=2,2个进程,观察同步/并行)    pool = Pool(processes=2)    start_time = time.time()  # 记录开始时间    # 用apply()提交3个任务(逐个提交,同步执行)    # task为对应函数,args传入对应的元组参数    res1 = pool.apply(task, args=(1))    res2 = pool.apply(task, args=(2))    res3 = pool.apply(task, args=(3))    # 关闭进程池,等待所有任务完成    pool.close() # 关闭进程池    pool.join() # 阻塞进程,等待所有进程执行完毕    # 打印结果和总耗时    print("任务结果:")    print(res1, res2, res3)    print(f"总执行时间:{time.time() - start_time:.2f}秒")    # 始终是同一个进程id执行任务,总用时3秒

3个任务依次排队执行,每个任务耗时1秒,总耗时约3秒;且始终用同一个进程(进程ID不变),进程池的多个进程没有被充分利用。这就是同步执行的弊端,完全浪费了进程池的并行能力。

二. apply_async()-异步提交任务(效率高)

  核心定义:向进程池提交任务,异步执行,提交任务后,主进程不等待该任务完成,继续提交下一个任务,进程池会自动分配空闲进程执行任务,相当于同时做多个任务。

  特点:执行效率高,能充分发挥进程池的并行优势;但不会直接返回任务结果,需通过get()方法获取。

# apply_async()并发异步执行多个任务,提高效率from multiprocessing import Poolimport osimport time# 定义任务函数(模拟任务执行耗时)def task(num):    time.sleep(1)  # 模拟任务耗时1秒    print(f"任务{num}执行中,进程ID:{os.getpid()}")    return f"任务{num}执行完毕(进程ID:{os.getpid()})"if __name__ == "__main__":    # 实例化进程池(设参数processes=2,2个进程,观察同步/并行)    pool = Pool(processes=2)    start_time = time.time()    # 用apply_async()提交3个任务(异步执行,无需等待)    # 提交任务后,返回结果对象(不是直接返回结果)    res_obj1 = pool.apply_async(task, args=(1,))    res_obj2 = pool.apply_async(task, args=(2,))    res_obj3 = pool.apply_async(task, args=(3,))    # 关闭进程池,等待所有任务完成    pool.close() # 关闭进程池    pool.join() # 阻塞进程,等待所有进程完毕    # 通过get()方法获取每个任务的结果(get()会等待任务完成)    res1 = res_obj1.get()    res2 = res_obj2.get()    res3 = res_obj3.get()    # 打印结果和总耗时    print("任务结果:")    print(res1, res2, res3)    print(f"总执行时间:{time.time() - start_time:.2f}秒")    # 两个进程异步执行,并排跑,总用时大概2秒

总结:今日我们学习了Python基础篇-多进程-进程池。重点掌握进程池中apply()与apply_async()两种任务提交方法。apply()为同步执行,需排队等待任务完成,效率低、进程利用率低,仅适用于简单测试;apply_async()为异步执行,主进程无需等待,能充分利用进程池资源,效率高,是实际开发首选。在Python基础篇,后续我们将持续学习Python基础知识,介绍各种算法,祝每一位study er学习愉快。

合集链接
这里是我滴合集内容链接,大家感兴趣就康康吧。
1. 人工智能进阶之路 - 机器学习篇
2. AI发展前点
3. 人工智能进阶之路-Python基础篇
4. 充电er的乱坠闲聊
5. Origin认知
点个 赞 你最好看

最新文章

随机文章