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命令行参数解析模块optparse使用实例
Apr 13 Python
Python简单进程锁代码实例
Apr 27 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
python基础练习之几个简单的游戏
Nov 10 Python
Python数据结构之顺序表的实现代码示例
Nov 15 Python
python框架中flask知识点总结
Aug 17 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
Django中create和save方法的不同
Aug 13 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
使用TFRecord存取多个数据案例
Feb 17 Python
PYTHON InceptionV3模型的复现详解
May 06 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
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
php的lavarel框架中join和orWhere的用法
2020/12/28 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
Node.js应用设置安全的沙箱环境
2018/04/23 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
详解vue v-model
2020/08/31 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
pycharm 使用心得(三)Hello world!
2014/06/05 Python
Python对文件操作知识汇总
2016/05/15 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
迪奥官网:Dior.com
2018/12/04 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
酷瑞网络科技面试题
2012/03/30 面试题
迎接领导欢迎词
2014/01/11 职场文书
说明书格式及范文
2014/05/07 职场文书
白血病募捐倡议书
2014/05/14 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书