Python多进程写入同一文件的方法


Posted in Python onJanuary 14, 2019

最近用python的正则表达式处理了一些文本数据,需要把结果写到文件里面,但是由于文件比较大,所以运行起来花费的时间很长。但是打开任务管理器发现CPU只占用了25%,上网找了一下原因发现是由于一个叫GIL的存在,使得Python在同一时间只能运行一个线程,所以只占用了一个CPU,由于我的电脑是4核的,所以CPU利用率就是25%了。

既然多线程没有什么用处,那就可以使用多进程来处理,毕竟多进程是可以不受GIL影响的。Python提供了一个multiprocessing的多进程库,但是多进程也有一些问题,比如,如果进程都需要写入同一个文件,那么就会出现多个进程争用资源的问题,如果不解决,那就会使文件的内容顺序杂乱。这就需要涉及到锁了,但是加锁一般会造成程序的执行速度下降,而且如果进程在多处需要向文件输出,也不好把这些代码整个都锁起来,如果都锁起来,那跟单进程还有什么区别。有一个解决办法就是把向文件的输出都整合到一块去,在这一块集中加个锁,这样问题就不大了。不过还有一种更加优雅的解决方式:使用multiprocessing库的回调函数功能。

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

下面是代码:

from multiprocessing import Pool
import time


def mycallback(x):
  with open('123.txt', 'a+') as f:
    f.writelines(str(x))


def sayHi(num):
  return num


if __name__ == '__main__':
  e1 = time.time()
  pool = Pool()

  for i in range(10):
    pool.apply_async(sayHi, (i,), callback=mycallback)

  pool.close()
  pool.join()
  e2 = time.time()
  print float(e2 - e1)

运行结果如下:

Python多进程写入同一文件的方法

以上这篇Python多进程写入同一文件的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 文件和输入输出小结
Oct 09 Python
python实现保存网页到本地示例
Mar 16 Python
Python功能键的读取方法
May 28 Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
python机器学习之神经网络(一)
Dec 20 Python
对python Tkinter Text的用法详解
Oct 11 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
详解python的argpare和click模块小结
Mar 31 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
基于python实现操作git过程代码解析
Jul 27 Python
Django使用channels + websocket打造在线聊天室
May 20 Python
python 将大文件切分为多个小文件的实例
Jan 14 #Python
使用k8s部署Django项目的方法步骤
Jan 14 #Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 #Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 #Python
用Python实现大文本文件切割的方法
Jan 12 #Python
python实时获取外部程序输出结果的方法
Jan 12 #Python
python实现控制台打印的方法
Jan 12 #Python
You might like
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
js实现单张图片平移切换效果
2017/10/11 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
Python中的True,False条件判断实例分析
2015/01/12 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
Python 内置函数complex详解
2016/10/23 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
实习生个人找工作的自我评价
2013/10/30 职场文书
高中生学习生活的自我评价
2013/11/27 职场文书
历史教育专业个人求职信
2013/12/13 职场文书
年度安全生产目标责任书
2014/07/23 职场文书
档案工作汇报材料
2014/08/21 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
优质服务标语口号
2015/12/26 职场文书
关于MySQL中explain工具的使用
2023/05/08 MySQL