Python使用多进程并行加速业务操作 完整代码

news/2025/1/16 3:56:11/

Python使用多进程并行加速业务操作 完整代码

  • 需求分析
  • 完整代码
  • 本demo性能分析
  • Python中单线程、多线程和多进程的效率对比实验

需求分析

   最近在对一个数据集进行处理,共2000条,每条去调一个第三方接口,耗时7-10秒。单线程处理一次要3.9-5.6小时,于是想着用多进程加速一下。 需求大致如下:

  1、能配置进程数目
  2、能加载要处理的数据
  3、能打印完善的日志
  4、多进程能共享处理后的数据结果,方便最终获取/导出
  5、锁、超时控制、异常控制

完整代码

  Python代码如下:(其中需要修改的地方加了TODO)在win和linux上都可以用

import logging
import math
import multiprocessing
import time
import pandas as pd
from contextlib import contextmanager
import threading# 设置日志配置
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.INFO)# 定义超时异常
class TimeoutException(Exception): pass# 超时控制
@contextmanager
def time_limit(seconds):timer = threading.Timer(seconds, lambda: _raise_timeout_exception())def _raise_timeout_exception():raise TimeoutException("Timed out!")try:timer.start()yieldfinally:timer.cancel()def process_data(i, data, results, lock):logging.info('------group: ' + str(i) + '------')logging.info('------len: ' + str(len(data)) + '------')for _, row in data.iterrows():if _ % (math.ceil(len(data) / 10.0)) == 0:logging.info('------group' + str(i) + ': ' + str(_) + '/' + str(len(data)) + '------')try:# 超时限制 TODO 秒数with time_limit(20):# 模拟任务 TODO 任务time.sleep(1)# 使用锁来保证对结果列表的进程安全访问lock.acquire()try:# 将结果添加到共享的结果列表中 TODO 收集结果results.append(row['id'])finally:lock.release()except Exception as e:logging.info('------err: ' + str(e) + '------')if __name__ == '__main__':# 手动设置并行进程数目 TODO 进程数目group_num = 8# 从电脑配置中设置并行进程数目# group_num = multiprocessing.cpu_count()# 读取数据 TODO 数据源data = pd.read_excel('data.xlsx')# 使用pandas平均划分数据grouped_data = data.groupby(data.index % group_num)# 定义共享的结果列表manager = multiprocessing.Manager()results = manager.list()# 创建锁lock = multiprocessing.Lock()start_time = time.time()# 定义多进程processes = []for i in range(group_num):p = multiprocessing.Process(target=process_data,args=(i, grouped_data.get_group(i).reset_index(), results, lock))processes.append(p)# 启动for _p in processes:_p.start()for _p in processes:_p.join()end_time = time.time()execution_time = end_time - start_time# 打印数据print(f"代码执行时间:{execution_time}秒")print(results)

  data.xlsx里面的数据是随便打的:

请添加图片描述

本demo性能分析

  16核CPU,执行上述代码,其中任务部分用了time.sleep(1)停了1秒,耗时分析如下:

进程数耗时
129.317383289337158秒
48.288025140762329秒
85.77861475944519秒
144.941734313964844秒
165.262717008590698秒

  可以看到加了多进程,加速效果还是比较明显的。

Python中单线程、多线程和多进程的效率对比实验

此处参考:http://blog.atomicer.cn/2016/09/30/Python

  我们知道,线程操作、进程操作一般分为CPU密集型操作、IO密集型操作、网络请求密集型操作。

  资料显示,如果多线程的进程是CPU密集型的,那多线程并不能有多少效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降,推荐使用多进程;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。所以我们根据实验对比不同场景的效率:

CPU密集型操作IO密集型操作网络请求密集型操作
线性操作94.9182499646922.461999952797.3296000004
多线程操作101.170000076224.86050009730.5053332647
多进程操作53.889999985712.78400003910.5045000315

  通过上面的结果,我们可以看到:

  多线程在IO密集型的操作下似乎也没有很大的优势(也许IO操作的任务再繁重一些就能体现出优势),在CPU密集型的操作下明显地比单线程线性执行性能更差,但是对于网络请求这种忙等阻塞线程的操作,多线程的优势便非常显著了

  多进程无论是在CPU密集型还是IO密集型以及网络请求密集型(经常发生线程阻塞的操作)中,都能体现出性能的优势。不过在类似网络请求密集型的操作上,与多线程相差无几,但却更占用CPU等资源,所以对于这种情况下,我们可以选择多线程来执行。


http://www.ppmy.cn/news/266574.html

相关文章

人工智能-深度学习-科研神器推荐

根据知乎问题 有没有什么可以节省大量时间的 Deep Learning 效率神器? 的回答,筛选整理出一些深度学习科研神器。包括参数优化、数据可视化、模型部署蒸馏剪枝等。收录到 人工智能-深度学习-科研神器推荐https://​www.webhub123.com/#/home/detail?p4O…

华为 HCIE 2.0(云服务)-- 云上可扩展性设计实验

实验内容 1、创建CCE集群 2、创建CCE工作负载(有状态/无状态) 3、CCE节点弹性伸缩 4、进入容器、执行K8S命令 实验目标 通过本实验,学会创建并配置云容器引擎CCE, 在CCE上部署典型WEB应用:应用(Deploymen…

华为大数据HCIE数据挖掘--ETL

什么是ETL ETL是一个数据管道,负责将分布的、异构的数据(Extract阶段)根据一定的业务规则进行数据清洗、转换、集成(Transform阶段),最终将处理后的数据加载到数据目的地(Load阶段),比如数据仓库。 数据抽取需要注意的点有哪些? …

华为HCIP-DATACOM(821)411-440

411.下面关于OSPF协议,哪些描述是正确的? A:第二类外部路由的开销值知识AS外部开销值,忽略AS内部开销值 B:AS-External-LSA不属于任何区域 C:AS-External-LSA描述到AS外部路由的路径,泛洪的范围是AS外部 D:AS-External-LSA描述…

HCIE-Datacom 2204day02

MSTP(Multiple Spanning Tree Protocol)--多生成树协议 产生背景 在STP协议中,存在两个不足:收敛慢,同时链路/设备利用率不高。所有的链路之间,仅仅是一个备份的关系,所有的VLAN在整个交换网络中…

移远EC200 EC20 EC600 EC800连接MQTT服务器

前言 移远的CAT1模块EC200S连接MQTT大致流程 ,经过测试,完全有效 A:开机 就是对模块进行断电2S在上电. B:基础配置 这部分跟连TCP服务器一样 (1):发送AT,确认模块是否正常 "AT\r\n" 模块返回:OK (2):取消模块回显 "ATE0\r\n" 模块返回:OK (3)检查SIM是…

华为 S5720-32X-EI-AC配置(配置web版)账号

<Huawei> sys [Huawei] aaa [Huawei-aaa] local-user huawei password irreversible-cipher huawei123 [Huawei-aaa] local-user huawei service-type http [Huawei-aaa] local-user huawei privilege level 15 [Huawei-aaa] return <Huawei> save 上述命令和配…

EC200 EC600 EC20接入工业互联网云平台

第三方设备接入云盒子说明文档 注册工业互联网云 www.sukon-cloud.com 物联网云盒子能帮助用户迅速搭建好设备管理后台&#xff0c;适合系统集成等用户。 此文章的测试模块使用的是移远的EC600N https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-21884152640.30.…