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中的文件和目录操作实现代码
Mar 13 Python
详细解读Python的web.py框架下的application.py模块
May 02 Python
python定时检查某个进程是否已经关闭的方法
May 20 Python
Python中使用ElementTree解析XML示例
Jun 02 Python
python中sys.argv函数精简概括
Jul 08 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
用python实现刷点击率的示例代码
Feb 21 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
python与pycharm有何区别
Jul 01 Python
浅谈python出错时traceback的解读
Jul 15 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 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
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
PHP生成器简单实例
2015/05/13 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
解密效果
2006/06/23 Javascript
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
2015/03/17 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python匹配中文的正则表达式
2016/05/11 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python切图九宫格的实现方法
2019/10/10 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
中国合伙人观后感
2015/06/02 职场文书