当前位置: 首页 > news >正文

一文详解Python中多进程和进程池的使用方法

这篇文章将介绍Python中多进程和进程池的使用方法,并提供一些实用的案例供大家参考,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

目录

Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。Python中的多进程和进程池是其强大的功能之一,可以让我们更加高效地利用CPU资源,提高程序的运行速度。本篇博客将介绍Python中多进程和进程池的使用方法,并提供一些实用的案例供读者参考。

一、多进程

多进程是指在同一计算机上,有多个进程同时执行不同的任务。Python中的多进程是通过multiprocessing模块来实现的。下面是一个简单的多进程示例:

1

2

3

4

5

6

7

8

9

import multiprocessing

def task(num):

    print('Task %d is running.' % num)

if __name__ == '__main__':

    for i in range(5):

        p = multiprocessing.Process(target=task, args=(i,))

        p.start()

上述代码中,我们定义了一个task函数,它接受一个参数num,用于标识任务。在主程序中,我们创建了5个进程,每个进程都执行task函数,并传入不同的参数。通过start()方法启动进程。运行上述代码,可以看到输出结果类似于下面这样:

Task 0 is running.
Task 1 is running.
Task 2 is running.
Task 3 is running.
Task 4 is running.

由于多进程是并发执行的,因此输出结果的顺序可能会有所不同。

二、进程池

进程池是一种管理多进程的机制,它可以预先创建一定数量的进程,并将任务分配给这些进程执行。Python中的进程池是通过ProcessPoolExecutor类来实现的。下面是一个简单的进程池示例:

1

2

3

4

5

6

7

8

9

import concurrent.futures

def task(num):

    print('Task %d is running.' % num)

if __name__ == '__main__':

    with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:

        for i in range(5):

            executor.submit(task, i)

上述代码中,我们使用了with语句创建了一个ProcessPoolExecutor对象,其中max_workers参数指定了进程池中最大的进程数量。在主程序中,我们创建了5个任务,每个任务都通过executor.submit()方法提交给进程池执行。运行上述代码,可以看到输出结果类似于下面这样:

Task 0 is running.
Task 1 is running.
Task 2 is running.
Task 3 is running.
Task 4 is running.

由于进程池中最大的进程数量为3,因此只有3个任务可以同时执行,其他任务需要等待进程池中的进程空闲后再执行。

三、使用案例

下面是一个实际的案例,展示了如何使用多进程和进程池来加速数据处理过程。假设我们有一个包含1000个元素的列表,需要对每个元素进行某种运算,并将结果保存到另一个列表中。我们可以使用单进程的方式来实现:

1

2

3

4

5

6

7

8

9

10

def process(data):

    result = []

    for item in data:

        result.append(item * 2)

    return result

if __name__ == '__main__':

    data = list(range(1000))

    result = process(data)

    print(result)

上述代码中,我们定义了一个process函数,它接受一个列表作为参数,对列表中的每个元素进行运算,并将结果保存到另一个列表中。在主程序中,我们创建了一个包含1000个元素的列表,并将其传递给process函数。运行上述代码,可以看到输出结果类似于下面这样:

[0, 2, 4, 6, 8, ..., 1996, 1998]

由于这是单进程的方式,因此处理1000个元素的时间可能会比较长。我们可以通过多进程和进程池来加速这个过程:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

import concurrent.futures

def process_chunk(chunk):

    result = []

    for item in chunk:

        result.append(item * 2)

    return result

def process(data):

    result = []

    chunk_size = 100

    chunks = [data[i:i+chunk_size] for i in range(0, len(data), chunk_size)]

    with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:

        futures = [executor.submit(process_chunk, chunk) for chunk in chunks]

        for future in concurrent.futures.as_completed(futures):

            result += future.result()

    return result

if __name__ == '__main__':

    data = list(range(1000))

    result = process(data)

    print(result)

上述代码中,我们首先将原始列表按照一定大小(这里是100)进行分块,然后将每个块提交给进程池中的进程执行。最后,我们使用concurrent.futures.as_completed()方法等待所有进程执行完毕,并将它们的结果合并到一个列表中。运行上述代码,可以看到输出结果与之前相同,但是处理时间可能会缩短很多。

总结

本篇博客介绍了Python中多进程和进程池的使用方法,并提供了一些实用的案例供读者参考。多进程和进程池是Python中强大的功能之一,可以帮助我们更加高效地利用CPU资源,提高程序的运行速度。在实际应用中,需要根据具体情况选择合适的方案来实现多进程和进程池。

                          

相关文章:

一文详解Python中多进程和进程池的使用方法

这篇文章将介绍Python中多进程和进程池的使用方法,并提供一些实用的案例供大家参考,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下 目录 Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。…...

前端部署发布项目后,如何通知用户刷新页面、清除缓存

以下只是一些思路,有更好的实现方式可以留言一起交流学习 方式一:纯前端 在每次发布前端时,使用webpack构建命令生成一个json文件,json中写个随机生成的一个字符串(比如时间戳),每次打包程序都…...

项目上线|慕尚集团携手盖雅工场,用数字化推动人效持续提升

过去十年,中国零售业以前所未有的速度被颠覆、被重塑,数字化则是其中重要的推动要素。 随着数字化转型的深入,零售企业的数字化不再局限于布局线上渠道,且更关乎其背后企业核心运营能力的全链路数字化改造。而贯穿于运营全链路的…...

Java重载 与封装、继承

方法重载 在同一个类中,出现了方法名相同,参数不同的方法时 ,我们叫方法重载 作用:根据不同参数,选择不同方法 实例 public static void main(String[] args){public int add(int a,int b){return ab;}public double…...

sed正则表达式替换字符方法

在 Linux 命令行中&#xff0c;可以使用 sed 命令来替换指定文件中的指定字符。具体方法如下&#xff1a; sed -i s/<old_string>/<new_string>/g <filename>其中&#xff0c;<old_string> 表示要被替换的字符串&#xff0c;<new_string> 表示替…...

不讲废话普通人了解 ChatGPT——基础篇第一课

wx供重浩&#xff1a;创享日记 获取更多内容 文章目录 前言什么是 ChatGPT它是如何工作的ChatGPT 和其它机器人有什么不同 前言 不知道大家在第一次会使用 ChatGPT 并尝试和他对话时有没有感到震惊。当ChatGPT首次推出时&#xff0c;我立即被它的功能所吸引。 曾经在遇到繁杂…...

MATLAB计算气象干旱指标:SAPEI

MATLAB计算干旱指标:SAPEI 标准化前降水蒸散发指数(Standardized Antecedent Precipitation Evapotranspiration Index, SAPEI)1 指数简介1.1 指数计算原理步骤1:计算潜在蒸散发(potential evapotranspiration, PET)步骤2:计算降水和PET的日差1.2 数据资料1.3 拟合分布的…...

GPT对SaaS领域有什么影响?

GPT火了&#xff0c;Chat GPT真的火了。 突然之间&#xff0c;所有人都在讨论AI&#xff0c;最初的访客是程序员、工程师、AI从业者&#xff0c;从早高峰写字楼电梯里讨论声&#xff0c;到村里大爷们的饭后谈资&#xff0c;路过的狗子都要和它讨论两句GPT的程度。 革命的前夜…...

backward()和zero_grad()在PyTorch中代表什么意思

文章目录 问&#xff1a;backward()和zero_grad()是什么意思&#xff1f;backward()zero_grad() 问&#xff1a;求导和梯度什么关系问&#xff1a;backward不是求导吗&#xff0c;和梯度有什么关系&#xff08;哈哈哈哈&#xff09;问&#xff1a;你可以举一个简单的例子吗问&a…...

C++多线程编程(一) thread类初窥

多线程编程使我们的程序能够同时执行多项任务。 在C11以前&#xff0c;C没有标准的多线程库&#xff0c;只能使用C语言中的pthread&#xff0c;在C11之后&#xff0c;C标准库中增加了thread类用于多线程编程。thread类其实是对pthread的封装&#xff0c;不过更加好用&#xff…...

Qt QVector 详解:从底层原理到高级用法

目录标题 引言&#xff1a;QVector的重要性与简介QVector的常用接口QVector和std::Vector迭代器&#xff1a;遍历QVector 中的元素&#xff08;Iterators: Traversing Elements in QVector&#xff09;常规索引遍历基于范围的for循环&#xff08;C11及以上&#xff09;使用STL样…...

快速弄懂RPC

快速弄懂RPC 常见的远程通信方式远程调用RPC协议RPC的运用场景和优势 常见的远程通信方式 基于REST架构的HTTP协议以及基于RPC协议的RPC框架。 远程调用 是指跨进程的功能调用。 跨进程可以理解为一个计算机节点的多个进程或者多个计算机节点的多个进程。 RPC协议 远程过…...

ONVIF协议介绍

目录标题 一、 ONVIF协议简介&#xff08;Introduction to ONVIF Protocol&#xff09;1.1 ONVIF的发展历程&#xff08;The Evolution of ONVIF&#xff09;1.2 ONVIF的主要作用与优势&#xff08;The Main Functions and Advantages of ONVIF&#xff09; 二、 ONVIF协议的底…...

AI大模型内卷加剧,商汤凭什么卷进来

2023年&#xff0c;国内大模型何其多。 目前&#xff0c;已宣布推出或即将推出大模型的国内企业多达20余家&#xff0c;基本上能想到的相关企业都已入局。其中&#xff0c;既有资金雄厚的BAT、华为、字节等大厂&#xff0c;也有王慧文、王小川、周伯文等互联网大佬领衔的初创企…...

企业网络安全漏洞分析及其解决_kaic

摘要 为了防范网络安全事故的发生,互联网的每个计算机用户、特别是企业网络用户&#xff0c;必须采取足够的安全防护措施&#xff0c;甚至可以说在利益均衡的情况下不惜一切代价。事实上&#xff0c;许多互联网用户、网管及企业老总都知道网络安全的要性&#xff0c;却不知道网…...

Docker网络模式与cgroups资源控制

目录 1.docker网络模式原理 2.端口映射 3.Docker网络模式&#xff08;41种&#xff09; 1.查看docker网络列表 2.网络模式详解 4.Docker cgroups资源控制 1.CPU资源控制 2.对内存使用的限制 3.对磁盘IO的配置控制&#xff08;blkio&#xff09;的限制 4.清除docker占用…...

Linux/C++:基于TCP协议实现网络版本计算器(自定义应用层协议)

目录 Sock.hpp TcpServer.hpp Protocol.hpp CalServer.cc CalClient.cc 分析 因为&#xff0c;TCP面向字节流&#xff0c;所以TCP有粘包问题&#xff0c;故我们需要应用层协议来区分每一个数据包。防止读取到半个&#xff0c;一个半数据包的情况。 Sock.hpp #pragma on…...

并发之阻塞队列

阻塞队列 使用背景作用从阻塞队列中获取元素常用的三个方法往阻塞队列中存放元素的三种方式 使用背景 想要在多个线程之间传递数据&#xff0c;用一般的对象是不行的&#xff0c;比如我们常用的ArrayList和HashMap都不适合由多个线程同时操作&#xff0c;可能会造成数据丢失或…...

nodejs+vue 智能餐厅菜品厨位分配管理系统

系统功能主要介绍以下几点&#xff1a; 本智能餐厅管理系统主要包括三大功能模块&#xff0c;即用户功能模块和管理员功能模块、厨房功能模块。 &#xff08;1&#xff09;管理员模块&#xff1a;系统中的核心用户是管理员&#xff0c;管理员登录后&#xff0c;通过管理员功能来…...

MySQL NULL 值

NULL 值是遗漏的未知数据&#xff0c;默认地&#xff0c;表的列可以存放 NULL 值。 本章讲解 IS NULL 和 IS NOT NULL 操作符。 如果表中的某个列是可选的&#xff0c;那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。 N…...

Python 机器人学习手册:1~5

原文&#xff1a;ILearning Robotics using Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff0c;你最好…...

OpenCV(14)-OpenCV4.0中文文档学习2(补充)

相机校准和3D重建 相机校准 标定 findChessboardCorners() 它返回角点和阈值&#xff0c;如果成功找到所有角点&#xff0c;则返回 True。这些角落将按顺序放置&#xff08;从左到右&#xff0c;从上到下&#xff09;cornerSubPix()用以寻找图案&#xff0c;找到角点后也可以…...

八、express框架解析

文章目录 前言一、express 路由简介1、定义2、基础使用 二、express 获取参数1、获取请求报文参数2、获取路由参数 三、express 响应设置1、一般响应设置2、其他响应设置 四、express 防盗链五、express 路由模块化1、模块中代码如下&#xff1a;2、主文件中代码如下&#xff1…...

SpringBoot整合接口管理工具Swagger

Swagger Swagger简介 Springboot整合swagger Swagger 常用注解 一、Swagger简介 ​ Swagger 是一系列 RESTful API 的工具&#xff0c;通过 Swagger 可以获得项目的⼀种交互式文档&#xff0c;客户端 SDK 的自动生成等功能。 ​ Swagger 的目标是为 REST APIs 定义一个标…...

50+常用工具函数之xijs更新指南(v1.2.3)

xijs 是一款开箱即用的 js 业务工具库, 聚集于解决业务中遇到的常用的js函数问题, 帮助开发者更高效的进行业务开发. 目前已聚合了50常用工具函数, 接下来就和大家一起分享一下v1.2.3 版本的更新内容. 1. 添加将树结构转换成扁平数组方法 该模块主要由 EasyRo 贡献, 添加内容如…...

【DAY42】vue学习

const routes [ { path: ‘/foo’, component: Foo }, { path: ‘/bar’, component: Bar } ]定义路由的作用是什么 const routes 定义路由的作用是将每一个 URL 请求映射到一个组件&#xff0c;其中 path 表示请求的 URL&#xff0c;component 表示对应的组件。 通过 const…...

JavaScript小记——事件

HTML 事件是发生在 HTML 元素上的事情。 当在 HTML 页面中使用 JavaScript 时&#xff0c; JavaScript 可以触发这些事件。 Html事件 HTML 事件可以是浏览器行为&#xff0c;也可以是用户行为。 以下是 HTML 事件的实例&#xff1a; HTML 页面完成加载HTML input 字段改变…...

Windows逆向安全(一)之基础知识(八)

if else嵌套 这次来研究if else嵌套在汇编中的表现形式&#xff0c;本次以获取三个数中最大的数这个函数为例子&#xff0c;分析if else的汇编形式 求三个数中的最大值 首先贴上代码&#xff1a; #include "stdafx.h"int result0; int getMax(int i,int j,int k)…...

PyCharm+PyQt5+pyinstaller打包labelImg.exe

0 开头 labelImg是一款标注软件&#xff0c;作为一个开源项目&#xff0c;它的源码可以在github上找到。官方仓库地址为&#xff1a; https://github.com/heartexlabs/labelImg 小白安装时的最新版本编译出来的界面长这样&#xff1a; 之前在小白的博客里&#xff0c;也教过…...

JavaScript里实现继承的几种方式

JavaScript 中的继承可以通过以下几种方式来实现&#xff1a; 1、原型链继承&#xff1a;通过将子类的原型对象指向父类的实例来实现继承。这种方式的优点是实现简单&#xff0c;缺点是父类的私有属性和方法子类是不能访问的。 function Parent() {this.name parent;this.ag…...