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 相关文章推荐
200行自定义python异步非阻塞Web框架
Mar 15 Python
python中利用队列asyncio.Queue进行通讯详解
Sep 10 Python
python opencv 图像尺寸变换方法
Apr 02 Python
python 对给定可迭代集合统计出现频率,并排序的方法
Oct 18 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
python爬虫 正则表达式解析
Sep 28 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
Python生成器传参数及返回值原理解析
Jul 22 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 Python
pycharm 配置svn的图文教程(手把手教你)
Jan 15 Python
pytorch 一行代码查看网络参数总量的实现
May 12 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
安装APACHE
2007/01/15 PHP
初步介绍PHP扩展开发经验分享
2012/09/06 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
简单使用Python自动生成文章
2014/12/25 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
2016/09/21 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
Django中的AutoField字段使用
2020/05/18 Python
python和php学习哪个更有发展
2020/06/17 Python
Python如何操作docker redis过程解析
2020/08/10 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
团工委书记自荐书范文
2013/12/17 职场文书
事业单位请假制度
2014/01/13 职场文书
政府门卫岗位职责
2014/04/29 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
就职演讲稿范文
2014/05/19 职场文书
计算机网络专业自荐信
2014/07/04 职场文书
大学生实训报告总结
2014/11/05 职场文书
离婚协议书样本
2015/01/26 职场文书
打架检讨书
2015/01/27 职场文书
用python自动生成日历
2021/04/24 Python
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技