python 多进程,程序运行越来越慢踩坑

        我是java系的,会点儿go,因为项目的原因,开始接触python,赶鸭子上架,也接触了python不少内容,其中就包括多线程和多进程,我介绍和记录一些我的实践,方便自己的同时,希望能帮助到其它的小伙伴。

        我先介绍一下我的应用场景,我需要用python解析大量的excel数据,20-30万行数据,然后构造一个请求的地址,用http调用,返回结果,连同原始数据一起生成excel。在生成excel的时候,为了保持原始数据顺序性,我会先把所有的请求结果用map存储在内存中,map的key为excel顺序号,value为url的结果。然后我会再次解析excel,从map中获取结果,进而生成excel。

        为什么要研究多线程或者多进程呢,因为数据比较多,我需要用多进程或者多线程并发访问url。

        在研究python多线程的时候,我发现因为GIL的原因,不管机器有多少个核,python只能用其中一个,如果想用上多个核的话,需要用python多进程。python多线程适合用做io密集型的任务,多进程适合用做cpu密集型的任务。我的场景是请求url,是一个io密集型的操作,按推荐来讲,我应该使用多线程,但我不确定GIL会在多大程度上影响我,在我遇到的业务场景中,也很少使用多进程的方式(除了跨主机多进程) 所以我打算用把多进程尝尝鲜。

        在进程间数据共享的方式上,我选择用共享内存的方式(后来证明这是一个不太好的方式)。

        我是这样使用多进程的

    # 多进程核心代码# 读取excelexcel_data = pd.read_excel(path, sheet_name)# 共享内存smm = Manager()response_map = smm.dict()# 用来存储生成excel的数据data = {}# 并发调用http接口http_pool = multiprocessing.Pool(processes=2)for index, row in excel_data.iterrows():doc_id = row['index']address = row['address']http_pool.apply_async(process_task, args=(doc_id, address, response_map))http_pool.close()http_pool.join()# 多进程请求url
def process_task(doc_id, address, response_map):# 请求地址response = http_call(address)if doc_id not in response_map.keys():response_map[doc_id] = responseelse:pass

        首先说多进程的好处
        1. 进程之间天然是隔离的,不需要用锁来控制各个请求,我从来没发现请求有驴唇不对马嘴的情况。

        其次就是多进程的坏处
        1. 程序运行起来之后,我发现一个现象,随着时间的推移,程序运行的越来越慢。我仔细思考了一下,我觉得是因为进程间共享数据比较消耗资源,随着response_map中数据越来越多,程序肉眼可见的变慢了。
        2. 程序长时间运行的时候报错MemoryError,但因为报错日志没有保存下来,具体错误原因不详,但我隐约感觉可能跟多进程共享大量数据有关系。

        之后我果断转向多线程
        我是这样使用多线程的

	# 读取excel数据excel_data = pd.read_excel(path, sheet_name).astype(str)# 请求统计counter = {"total": 0,"repeat_num": 0,"empty_num": 0,"error_num": 0}# 并发调用http接口futures = {}response_map = {}with concurrent.futures.ThreadPoolExecutor(max_workers=process) as executor:for index, row in excel_data.iterrows():doc_id = row['index']address = row['address']# 发送请求future = executor.submit(process_task, doc_id, address, response_map, index, counter)futures[future] = doc_idfor future in concurrent.futures.as_completed(futures):pass
# 多线程执行代码
def process_task(doc_id, ec_addr, address, response_map, index, counter):try:with lock:counter['total'] += 1if ec_addr == '':counter['empty_num'] += 1returnif doc_id in response_map.keys():counter['repeat_num'] += 1returnresponse = http_call(address, index)with lock:response_map[doc_id] = responseexcept Exception:with lock:counter['error_num'] += 1

        使用多线程之后,程序越运行越慢的问题解决了,MemoryError的错误在也没有见过。副作用是需要仔细lock好共享数据,不然会有请求和结果对不上的情况。

        感谢python,让我对多进程以及进程之间通过内存共享数据有了直观的感受。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18491.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习的艺术:揭秘卷积神经网络(CNN)的神秘面纱

深度学习的艺术:揭秘卷积神经网络(CNN)的神秘面纱 一、CNN的构成要素二、CNN的工作流程三、CNN的应用领域四、CNN的优势与局限 #引言: 在人工智能的璀璨星空中,卷积神经网络(CNN)如同一颗耀眼的…

Linux高阶——1116—环形队列生产者消费者

目录 1、环形队列 2、生产者消费者 环形队列数组实现代码 成功截图 1、环形队列 相比于线性队列,环形队列可以有效避免访问越界问题,使用下标访问队列元素时,到达末尾后下标归0,返回起始位置,使用下标运算即可 a…

学习大数据DAY61 宽表加工

目录 模型设计 加工宽表 任务调度: 大表 - 把很多数据整合起来 方便后续的明细查询和指标计算 模型设计 设计 建模 设计: excel 文档去编写 建模: 使用建模工具 PowerDesigner Navicat 在线画图工具... 把表结构给绘 制出来 共享\项目课工具\pd 加工宽表 数…

DBeaver MACOS 安装 并连接到docker安装的mysql

官网下载:Download | DBeaver Community 网盘下载:链接: https://pan.baidu.com/s/15fAhbflHO-AGc-uAnc3Rjw?pwdbrz9 提取码: brz9 下载驱动 连接测试 报错 null, message from server: "Host 172.17.0.1 is not allowed to connect to this M…

24首届数证杯(流量分析部分)

目录 流量分析 流量分析 1、分析网络流量包检材,写出抓取该流量包时所花费的秒数?(填写数字,答案格式:10) 3504相加即可 2、分析网络流量包检材,抓取该流量包时使用计算机操作系统的build版本是多少? 23F793、分析网络流量包检材&#x…

云服务器ECS经济型e实例和通用算力u1实例有啥区别?

阿里云服务器ECS经济型e实例怎么样?对比ECS通用算力型u1实例哪个更好?u1实例更好。阿里云服务器网aliyunfuwuqi.com二者均为云服务器ECS的实例规格,e实例是共享型云服务器,u1实例是独享型云服务器,何为共享&#xff1f…

QT中使用图表之QChart绘制柱状图

绘制条形(柱状)图,系列选择条形系列QBarSeries x轴选择条形图的种类轴QBarCategoryAxis 1、创建图表视图 //1、创建图表视图 QChartView * view new QChartView(this); //开启抗锯齿 view -> setRenderHint(QPainter::Antialiasing); …

Essential Cell Biology--Fifth Edition--Chapter one (8)

1.1.4.6 The Cytoskeleton [细胞骨架] Is Responsible for Directed Cell Movements 细胞质基液不仅仅是一种无结构的化学物质和细胞器的混合物[soup]。在电子显微镜下,我们可以看到真核细胞的细胞质基液是由长而细的丝交叉而成的。通常[Frequently],可…

【Linux】守护进程

目录 进程组 会话 作业控制 实现守护进程 我们在写完一些网络服务后,如果想让这个服务一直在云服务器的后台运行着,那该如何实现呢?其实就用到了这篇博客要讲的守护进程 进程组 我们首先需要了解进程组的概念,其实sleep 1000这…

nginx.conf配置文件中的命令

打开我们的conf文件 nginx.conf文件中,分为3大块: 全局块,就是events和http块之外的内容。设置nginx服务器整体运行的指令 格式为: 指令名 指令值 events块,用于配置与用户的网络连接的内容,对nginx的…

51单片机基础07 实时时钟-思路及代码参考1

目录 一、实现功能 二、思路1的分析 1、定时器0 2、外部中断0 3、主函数main 4、其他重要功能函数 一、实现功能 1、实现最基本的计时功能,显示时、分、秒,可以通过按键设置时间。 要求:时钟计时精确,按键操作不影响计时。…

vTESTstudio系列15--vTESTstudio-Doors的需求和测试用例的管理

最近有朋友在咨询vTESTstudio中怎么去跟Doors里面的需求去做好管理这方面的问题,临时加两篇文章介绍一下,Lets Go!!! 目录 1.Doors的配置: 1.1 安装Doors AddIn for vTESTstudio: 1.2 更新XML脚本: 1.3 导出需求的Trace Item…

基于Java Springboot编程语言在线学习平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

JDK安装报错“以下应用程序正在使用需要由此安装程序更新的文件”

(一)问题描述 我刚刚没有截图,这是我在网上看到的图: (二)可能的解决办法 1. 下方工具栏右键,打开任务管理器按钮,在进程中找到“Java Platform SE binary” 进程,右键结…

数据库第3次作业

学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:SC (Sno, Cno, Score)…

Linux之文件系统,软硬连接和动静态库

Linux之文件系统,软硬连接和动静态库 一.文件系统1.1磁盘的存储结构1.2CHS和LBA1.3ext2文件系统 二.软硬连接2.1软链接2.2硬链接 三.静态库和动态库3.1静态库与动态库的概念3.2静态库的创建与使用3.3动态库的创建与使用3.4动态库的加载 一.文件系统 在上篇的学习中…

【项目开发】URL中井号(#)的技术细节

未经许可,不得转载。 文章目录 前言一、# 的基本含义二、# 不参与 HTTP 请求三、# 后的字符处理机制四、# 的变化不会触发网页重新加载五、# 的变化会记录在浏览器历史中六、通过 window.location.hash 操作七、onhashchange 事件八、Google 对 # 的处理机制前言 2023 年 9 月…

TikZ 绘图学习笔记

这篇笔记的所有代码如下: % !TEX TS-program pdflatex % !TEX encoding UTF-8 Unicode% This is a simple template for a LaTeX document using the "article" class. % See "book", "report", "letter" for other typ…

Android Framework层介绍

文章目录 前言一、Android Framework 层概述二、主要组件1. 应用程序接口(API)2. 系统服务3. Binder4. 资源管理5. Content Provider6. 广播接收器(BroadcastReceiver)7. 服务(Service) 三、与 Linux Kerne…

如何选择等保服务

在当今信息化高速发展的时代,企业信息系统已成为业务运营的核心支撑,其安全性直接关系到企业的生存与发展。为了应对日益复杂的网络安全威胁,国家推行了等级保护(简称等保)制度,作为一项基本的信息安全保障…