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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
Python中使用Inotify监控文件实例
Feb 14 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
python基础教程项目四之新闻聚合
Apr 02 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
Python递归实现打印多重列表代码
Feb 27 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 Python
python使用隐式循环快速求和的实现示例
Sep 11 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的cms
2010/12/19 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
PHP在线书签系统分享
2016/01/04 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
js轮播图代码分享
2016/07/14 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
django静态文件加载的方法
2018/05/20 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
详解Python对JSON中的特殊类型进行Encoder
2019/07/15 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
谈谈python垃圾回收机制
2020/09/27 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
英国标志性生活方式品牌:Skinnydip London
2019/12/15 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
走进毛泽东观后感
2015/06/04 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
解决redis批量删除key值的问题
2022/03/23 Redis
JS函数式编程实现XDM一
2022/06/16 Javascript