Python多进程之进程池

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 由于Python中线程封锁机制,导致Python中的多线程并不是正真意义上的多线程。当我们有并行处理需求的时候,可以采用多进程迂回地解决。

由于Python中线程封锁机制,导致Python中的多线程并不是正真意义上的多线程。当我们有并行处理需求的时候,可以采用多进程迂回地解决。

如果要在主进程中启动大量的子进程,可以用进程池的方式批量创建子进程。
首先,创建一个进程池子,然后使用apply_async()方法将子进程加入到进程池中。

import multiprocessing
import os
import time
from datetime import datetime


def subprocess(number):
    # 子进程
    print('这是第%d个子进程' % number)
    pid = os.getpid()  # 得到当前进程号
    print('当前进程号:%s,开始时间:%s' % (pid, datetime.now().isoformat()))
    time.sleep(30)  # 当前进程休眠30秒
    print('当前进程号:%s,结束时间:%s' % (pid, datetime.now().isoformat()))


def mainprocess():
    # 主进程
    print('这是主进程,进程编号:%d' % os.getpid())
    t_start = datetime.now()
    pool = multiprocessing.Pool()
    for i in range(8):
        pool.apply_async(subprocess, args=(i,))
    pool.close()
    pool.join()
    t_end = datetime.now()
    print('主进程用时:%d毫秒' % (t_end - t_start).microseconds)


if __name__ == '__main__':
    # 主测试函数
    mainprocess()

Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。
可能的运行结果:

这是主进程,进程编号:10264
这是第0个子进程
当前进程号:10688,开始时间:2017-04-05T11:23:47.039989
这是第1个子进程
当前进程号:10152,开始时间:2017-04-05T11:23:47.055615
这是第2个子进程
当前进程号:5764,开始时间:2017-04-05T11:23:47.055615
这是第3个子进程
当前进程号:6392,开始时间:2017-04-05T11:23:47.055615
这是第4个子进程
当前进程号:9744,开始时间:2017-04-05T11:23:47.055615
这是第5个子进程
当前进程号:2636,开始时间:2017-04-05T11:23:47.071240
这是第6个子进程
当前进程号:6788,开始时间:2017-04-05T11:23:47.071240
这是第7个子进程
当前进程号:1604,开始时间:2017-04-05T11:23:47.071240
当前进程号:10688,结束时间:2017-04-05T11:24:17.053047
当前进程号:10152,结束时间:2017-04-05T11:24:17.062183
当前进程号:5764,结束时间:2017-04-05T11:24:17.062183
当前进程号:9744,结束时间:2017-04-05T11:24:17.062183
当前进程号:6392,结束时间:2017-04-05T11:24:17.062183
当前进程号:2636,结束时间:2017-04-05T11:24:17.072177
当前进程号:6788,结束时间:2017-04-05T11:24:17.072177
当前进程号:1604,结束时间:2017-04-05T11:24:17.072177
主进程用时:255168毫秒

官方API文档说明:

close()
Prevents any more tasks from being submitted to the pool. Once all the tasks have been completed the worker processes will exit.

join()
Wait for the worker processes to exit. One must call close() or terminate() before using join().
目录
相关文章
|
13天前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
21 3
|
10天前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
12 0
|
18天前
|
数据采集 消息中间件 Python
Python爬虫-进程间通信
Python爬虫-进程间通信
11 0
|
27天前
|
数据采集 Linux 调度
Python之多线程与多进程
Python之多线程与多进程
25 0
|
1月前
|
存储 算法 Java
关于python3的一些理解(装饰器、垃圾回收、进程线程协程、全局解释器锁等)
该文章深入探讨了Python3中的多个重要概念,包括装饰器的工作原理、垃圾回收机制、进程与线程的区别及全局解释器锁(GIL)的影响等,并提供了详细的解释与示例代码。
22 0
|
1月前
|
调度 Python
python3多进程实战(python3经典编程案例)
该文章提供了Python3中使用多进程的实战案例,展示了如何通过Python的标准库`multiprocessing`来创建和管理进程,以实现并发任务的执行。
59 0
|
5月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
2月前
|
Python
python Process 多进程编程
python Process 多进程编程
35 1
|
2月前
|
并行计算 开发者 Python
解锁Python多进程编程的超能力:并行计算的魔法与奇迹,探索处理器核心的秘密,让程序性能飞跃!
【8月更文挑战第12天】在Python编程领域,多进程编程是一项关键技能,能有效提升程序效率。本文通过理论与实践结合,深入浅出地介绍了Python中的多进程编程。首先解释了多进程的概念:即操作系统中能够并发执行的多个独立单元,进而提高整体性能。接着重点介绍了`multiprocessing`模块,演示了如何创建和启动进程,以及进程间的通信方式,如队列等。此外,还提到了更高级的功能,例如进程池管理和同步原语等。通过这些实例,读者能更好地理解如何在实际项目中利用多核处理器的优势,同时注意进程间通信和同步等问题,确保程序稳定高效运行。
39 0
|
4月前
|
Python
Python多进程编程详细剖析
Python多进程编程详细剖析
37 3