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 相关文章推荐
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
python实现排序算法
Feb 14 Python
在Django的视图中使用form对象的方法
Jul 18 Python
TensorFlow损失函数专题详解
Apr 26 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 Python
python去重,一个由dict组成的list的去重示例
Jan 21 Python
Python常用的json标准库
Feb 19 Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
golang/python实现归并排序实例代码
Aug 30 Python
python实现一个简单RPC框架的示例
Oct 28 Python
Django websocket原理及功能实现代码
Nov 14 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网站被挂木马后的修复方法总结
2014/11/06 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
表单JS弹出填写提示效果代码
2011/04/16 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
python实现串口通信的示例代码
2020/02/10 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
印度尼西亚最大和最全面的网络商城:Blibli.com
2017/10/04 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
保送生自荐信范文
2013/10/06 职场文书
岗位职责的定义
2013/11/10 职场文书
中职招生先进个人材料
2014/08/31 职场文书
英语演讲开场白
2015/05/29 职场文书
厉行节约工作总结
2015/08/12 职场文书
中秋节主题班会
2015/08/14 职场文书
2016年父亲节寄语
2015/12/04 职场文书
Python绘制分类图的方法
2021/04/20 Python
vue引入Excel表格插件的方法
2021/04/28 Vue.js
在js中修改html body的样式
2021/11/11 Javascript