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中使用mysql数据库详细介绍
Mar 27 Python
python编程开发之日期操作实例分析
Nov 13 Python
如何利用Fabric自动化你的任务
Oct 20 Python
python字符串str和字节数组相互转化方法
Mar 18 Python
Python实现自动为照片添加日期并分类的方法
Sep 30 Python
python链接oracle数据库以及数据库的增删改查实例
Jan 30 Python
Flask实现跨域请求的处理方法
Sep 27 Python
Python基础教程之异常详解
Jan 10 Python
Python 窗体(tkinter)按钮 位置实例
Jun 13 Python
python 使用raw socket进行TCP SYN扫描实例
May 05 Python
flask开启多线程的具体方法
Aug 02 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 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
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
javascript下查找父节点的简单方法
2007/08/13 Javascript
JavaScript 给汉字排序实例代码
2008/06/28 Javascript
Ext.MessageBox工具类简介
2009/12/10 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
js中int和string数据类型互相转化实例
2019/01/16 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
Python 实现进度条的六种方式
2021/01/06 Python
Python中Qslider控件实操详解
2021/02/20 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
介绍一下Java中标识符的命名规则
2014/02/03 面试题
公积金转移接收函
2014/01/11 职场文书
光荣入党自我鉴定
2014/01/22 职场文书
励志演讲稿范文
2014/04/29 职场文书
英文慰问信
2015/02/14 职场文书
求职自我评价范文
2015/03/09 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
旷工检讨书大全
2015/08/15 职场文书