Python多进程中的文件写入问题

您所在的位置:网站首页 保存操作失败:写文件时出现问题 Python多进程中的文件写入问题

Python多进程中的文件写入问题

2024-07-04 16:14:03| 来源: 网络整理| 查看: 265

因项目数据量庞大需要使用多进程的方法计算数据(计算密集型) 在写完代码之后,发现如果按照如下写法,则并不会并发执行,而是执行完一个接着执行第二个

print('Parent process %s.' % os.getpid()) p = Pool(5) for i in range(0, len(dataB), int(len(dataB) / 5)): dataC = (dataB.iloc[i:int(i + len(dataB) / 5)]) df_list = pd.concat([dataA, dataC], sort=True) res = p.apply_async(long_time_task, args=(i, df_list, dataA.iloc[:, :1], dataC.iloc[:, :1],)) res.get().to_csv('result0211.csv', mode='a', header=False, index=False) print('Waiting for all subprocesses done...') p.close() p.join() print('All subprocesses done.')

在这里插入图片描述 测试发现,只有当

res = p.apply_async(long_time_task, args=(i, df_list, dataA.iloc[:, :1], dataC.iloc[:, :1],))

这句话后面没有语句的时候,进程才会并发执行(还没查到什么原因),但这样带来的问题就是,每个进程的数据无法存储 如果把存储语句写到long_time_task()函数,文件为空,可能原因是: 1)主进程不会等待IO读写完毕,而是运算完直接关闭所有进程; 2)多进程中不同进程是相互独立,即在多个进程下把数据写入同一文件由于是并发进行操作系统中会不清楚到底要写入哪个数据到文件中,所以会出现资源竞争混乱,导致文件内容出现空

而且如果进程都需要写入同一个文件,那么就会出现多个进程争用资源的问题,如果不解决,那就会使文件的内容顺序杂乱。这就需要涉及到锁了,但是加锁一般会造成程序的执行速度下降,而且如果进程在多处需要向文件输出,也不好把这些代码整个都锁起来,如果都锁起来,那跟单进程还有什么区别。

后来百度的解决方法为,使用回调函数

具体思路跟把文件输出集中在一起也差不多,就是把进程需要写入文件的内容作为返回值返回给惠和的回调函数,使用回调函数向文件中写入内容。这样做在windows下面还有一个好处,在windows环境下,python的多进程没有像linux环境下的多进程一样,linux环境下的multiprocessing库是基于fork函数,父进程fork了一个子进程之后会把自己的资源,比如文件句柄都传递给子进程。但是在windows环境下没有fork函数,所以如果你在父进程里打开了一个文件,在子进程中写入,会出现ValueError: I/O operation on closed file这样的错误,而且在windows环境下最好加入if name == 'main’这样的判断,以避免一些可能出现的RuntimeError或者死锁。

def mycallback(res): res.to_csv('result_0211.csv', mode='a', header=False, index=False) if __name__=='__main__': print('Parent process %s.' % os.getpid()) p = Pool(5) for i in range(0, len(dataB), int(len(dataB) / 5)): dataC = (dataB.iloc[i:int(i + len(dataB) / 5)]) df_list = pd.concat([dataA, dataC], sort=True) p.apply_async(long_time_task, args=(i, df_list, dataA.iloc[:, :1], dataC.iloc[:, :1],), callback=mycallback) print('Waiting for all subprocesses done...') p.close() p.join() print('All subprocesses done.')

可以看到程序并发执行了 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭