Python多进程之进程池

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
大数据开发治理平台 DataWorks,不限时长
简介: 由于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().
目录
相关文章
|
7天前
|
Python
python Process 多进程编程
python Process 多进程编程
17 1
|
12天前
|
存储 安全 Python
[python]使用标准库logging实现多进程安全的日志模块
[python]使用标准库logging实现多进程安全的日志模块
|
7天前
|
并行计算 开发者 Python
解锁Python多进程编程的超能力:并行计算的魔法与奇迹,探索处理器核心的秘密,让程序性能飞跃!
【8月更文挑战第12天】在Python编程领域,多进程编程是一项关键技能,能有效提升程序效率。本文通过理论与实践结合,深入浅出地介绍了Python中的多进程编程。首先解释了多进程的概念:即操作系统中能够并发执行的多个独立单元,进而提高整体性能。接着重点介绍了`multiprocessing`模块,演示了如何创建和启动进程,以及进程间的通信方式,如队列等。此外,还提到了更高级的功能,例如进程池管理和同步原语等。通过这些实例,读者能更好地理解如何在实际项目中利用多核处理器的优势,同时注意进程间通信和同步等问题,确保程序稳定高效运行。
19 0
|
15天前
|
数据采集 并行计算 程序员
Python中的并发编程:理解多线程与多进程
在Python编程中,理解并发编程是提升程序性能和效率的关键。本文将深入探讨Python中的多线程和多进程编程模型,比较它们的优劣势,并提供实际应用中的最佳实践与案例分析。
|
2月前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
|
27天前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
22天前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
30 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
18天前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
|
1月前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
132 1
|
1月前
|
小程序 Linux
【编程小实验】利用Linux fork()与文件I/O:父进程与子进程协同实现高效cp命令(前半文件与后半文件并行复制)
这个小程序是在文件IO的基础上去结合父子进程的一个使用,利用父子进程相互独立的特点实现对数据不同的操作