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生成验证码实例
Aug 21 Python
详解Python中内置的NotImplemented类型的用法
Mar 31 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
分享6个隐藏的python功能
Dec 07 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 Python
tensorflow mnist 数据加载实现并画图效果
Feb 05 Python
python 利用panda 实现列联表(交叉表)
Feb 06 Python
教你使用Python pypinyin库实现汉字转拼音
May 27 Python
pytorch 如何使用batch训练lstm网络
May 28 Python
python可视化之颜色映射详解
Sep 15 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操作XML作为数据库的类
2010/12/19 PHP
PHP中文分词的简单实现代码分享
2011/07/17 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
JavaScript面向对象之体会[总结]
2008/11/13 Javascript
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
javascript判断office版本示例
2014/04/11 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
js图片延迟加载(Lazyload)三种实现方式
2017/03/01 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
用python + openpyxl处理excel2007文档思路以及心得
2014/07/14 Python
Django返回json数据用法示例
2016/09/18 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
python Tkinter版学生管理系统
2019/02/20 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
韩国美国时尚服装和美容在线全球市场:KOODING
2018/11/07 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
美国购买隐形眼镜网站:Lenses For Less
2020/07/05 全球购物
化学学院毕业生自荐信范文
2013/12/17 职场文书
起诉状范本
2015/05/20 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
zabbix监控mysql的实例方法
2021/06/02 MySQL
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL