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中list列表的一些进阶使用方法介绍
Aug 15 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
python多进程实现文件下载传输功能
Jul 28 Python
Python数据类型之List列表实例详解
May 08 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
python字符串下标与切片及使用方法
Feb 13 Python
解决Django中checkbox复选框的传值问题
Mar 31 Python
DataFrame.groupby()所见的各种用法详解
Jun 14 Python
在Mac中配置Python虚拟环境过程解析
Jun 22 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 magic quotes的详解
2013/06/17 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
Javascript快速排序算法详解
2014/12/03 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
浅谈$('div a') 与$('div>a')的区别
2016/07/18 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
Python中的匿名函数使用简介
2015/04/27 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
彻底搞懂Python字符编码
2018/01/23 Python
将python安装信息加入注册表的示例
2019/11/20 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
您的网上新华书店:文轩网
2016/08/24 全球购物
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
惠普香港官方商店:HP香港
2019/04/30 全球购物
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
简单的项目建议书模板
2014/03/12 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书
公司回复函格式
2015/07/14 职场文书
2015大一新生军训感言
2015/08/01 职场文书
django学习之ajax post传参的2种格式实例
2021/05/14 Python
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android