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模块学习 re 正则表达式
May 19 Python
python实现文件名批量替换和内容替换
Mar 20 Python
详解Django中Request对象的相关用法
Jul 17 Python
bpython 功能强大的Python shell
Feb 16 Python
tensorflow: 查看 tensor详细数值方法
Jun 13 Python
Python flask框架post接口调用示例
Jul 03 Python
Pytorch之保存读取模型实例
Dec 30 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
Feb 14 Python
Python如何使用内置库matplotlib绘制折线图
Feb 24 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 Python
利用Python实现斐波那契数列的方法实例
Jul 26 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
Javascript中的变量使用说明
2010/05/18 Javascript
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
python修改注册表终止360进程实例
2014/10/13 Python
利用python爬取散文网的文章实例教程
2017/06/18 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
西尔斯百货官网:Sears
2016/09/06 全球购物
学生会竞选自荐信
2013/10/12 职场文书
房地产财务管理制度
2014/02/02 职场文书
产品发布会策划方案
2014/05/12 职场文书
高中生旷课检讨书
2014/10/08 职场文书
中标通知书
2015/04/17 职场文书
天那边观后感
2015/06/09 职场文书
焦点访谈观后感
2015/06/11 职场文书
python 离散点图画法的实现
2022/04/01 Python