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中MySQLdb的事务处理功能
Sep 21 Python
python3设计模式之简单工厂模式
Oct 17 Python
Linux CentOS7下安装python3 的方法
Jan 21 Python
使用Django和Python创建Json response的方法
Mar 26 Python
Jupyter中直接显示Matplotlib的图形方法
May 24 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
通过celery异步处理一个查询任务的完整代码
Nov 19 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
python 使用opencv 把视频分割成图片示例
Dec 12 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
Apr 08 Python
Python调用shell命令常用方法(4种)
May 11 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
php 正则表达式小结
2009/08/31 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
PHP实现的购物车类实例
2015/06/17 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
jquery JSON的解析方式
2009/07/25 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
2015/10/23 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
使用Scrapy爬取动态数据
2018/10/21 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
python英语单词测试小程序代码实例
2019/09/09 Python
python实现翻译word表格小程序
2020/02/27 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
使用CSS3实现字体颜色渐变的实现
2020/08/10 HTML / CSS
考察现实表现材料
2014/05/19 职场文书
文明礼仪标语
2014/06/13 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
教师考核表个人总结
2015/02/12 职场文书
2015年工会工作总结
2015/03/30 职场文书
投诉信格式范文
2015/07/02 职场文书
高三数学教学反思
2016/02/18 职场文书