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实现在目录中查找指定文件的方法
Nov 11 Python
用Python进行TCP网络编程的教程
Apr 29 Python
Python 正则表达式实现计算器功能
Apr 29 Python
EM算法的python实现的方法步骤
Jan 02 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
django基于存储在前端的token用户认证解析
Aug 06 Python
在 Python 中接管键盘中断信号的实现方法
Feb 04 Python
解决python 找不到module的问题
Feb 12 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
python 详解turtle画爱心代码
Feb 15 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实现利用phpexcel导出数据
2013/08/24 PHP
浅谈php命令行用法
2015/02/04 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
jquery 3D球状导航的文章分类
2010/07/06 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
微信小程序自定义组件
2017/08/16 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
python简单的函数定义和用法实例
2015/05/07 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
python-numpy-指数分布实例详解
2019/12/07 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
外贸学院会计专业应届生求职信
2013/11/14 职场文书
毕业自我鉴定书
2014/03/24 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
大学生党员个人总结
2015/02/13 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
八年级语文教学反思
2016/03/03 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android