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逆向入门教程
Jan 15 Python
python selenium firefox使用详解
Feb 26 Python
Python Image模块基本图像处理操作小结
Apr 13 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
Feb 11 Python
Python dict和defaultdict使用实例解析
Mar 12 Python
Python参数传递实现过程及原理详解
May 14 Python
30行Python代码实现高分辨率图像导航的方法
May 22 Python
Numpy 多维数据数组的实现
Jun 18 Python
Python如何实现线程间通信
Jul 30 Python
如何在pycharm中快捷安装pip命令(如pygame)
May 31 Python
Elasticsearch 数据类型及管理
Apr 19 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学习 函数 课件
2008/06/15 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
jQuery基于正则表达式的表单验证功能示例
2017/01/21 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
Python的randrange()方法使用教程
2015/05/15 Python
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
会计学专业学生的求职信范文
2014/01/27 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
2014年法制宣传日活动方案
2014/11/02 职场文书
高三数学教学反思
2016/02/18 职场文书
python实现股票历史数据可视化分析案例
2021/06/10 Python
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript