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模块学习 filecmp 文件比较
Aug 27 Python
Pyramid添加Middleware的方法实例
Nov 27 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
python3爬取淘宝信息代码分析
Feb 10 Python
Python Numpy库安装与基本操作示例
Jan 08 Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 Python
Python Numpy 自然数填充数组的实现
Nov 28 Python
关于Numpy中的行向量和列向量详解
Nov 30 Python
Python实现微信好友的数据分析
Dec 16 Python
python logging设置level失败的解决方法
Feb 19 Python
requests在python中发送请求的实例讲解
Feb 17 Python
Python基础之元组与文件知识总结
May 19 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
PHP读取目录下所有文件的代码
2008/01/07 PHP
php数组(array)输出的三种形式详解
2013/06/05 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
农历与西历对照
2006/09/06 Javascript
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
JavaScript运算符小结
2015/06/03 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
ReactNative页面跳转Navigator实现的示例代码
2017/08/02 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python脚本实现代码行数统计代码分享
2015/03/10 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
校领导推荐信
2013/11/01 职场文书
播音主持专业个人自我评价
2014/01/09 职场文书
委托书范本
2014/04/02 职场文书
离婚协议书的书写要求
2014/09/17 职场文书
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers