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 相关文章推荐
Python3基础之list列表实例解析
Aug 13 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
利用python爬取斗鱼app中照片方法实例
Dec 03 Python
python爬取网页转换为PDF文件
Jun 07 Python
pandas 数据实现行间计算的方法
Jun 08 Python
基于python 微信小程序之获取已存在模板消息列表
Aug 05 Python
使用Fabric自动化部署Django项目的实现
Sep 27 Python
Python发送邮件的实例代码讲解
Oct 16 Python
Django REST framework 单元测试实例解析
Nov 07 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 Python
Python如何实现的二分查找算法
May 27 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
Jan 13 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执行.SQL文件
2013/07/05 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
PHP页面中文乱码分析
2013/10/29 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
学习从实践开始之jQuery插件开发 对话框插件开发
2012/04/26 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
JavaScript中import用法总结
2019/01/20 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
2020/04/01 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
英语专业毕业生自荐信范文
2013/12/31 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
眼镜促销方案
2014/03/15 职场文书
学校火灾防控方案
2014/06/09 职场文书
园林技术专业求职信
2014/07/28 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
成事在人观后感
2015/06/16 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL