Python多进程写入同一文件的方法

 更新时间:2019年01月14日 08:51:38   作者:bluespacezero  
今天小编就为大家分享一篇Python多进程写入同一文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

最近用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中字符串比较使用is、==和cmp()总结

    python中字符串比较使用is、==和cmp()总结

    在Python中比较字符串最好是使用简单逻辑操作符,今天为大家讲解一下is、==和cmp()使用总结
    2018-03-03
  • python爬虫_实现校园网自动重连脚本的教程

    python爬虫_实现校园网自动重连脚本的教程

    下面小编就为大家分享一篇python爬虫_实现校园网自动重连脚本的教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python3利用Dlib19.7实现摄像头人脸识别的方法

    Python3利用Dlib19.7实现摄像头人脸识别的方法

    这篇文章主要介绍了Python 3 利用 Dlib 19.7 实现摄像头人脸识别 ,利用python开发,借助Dlib库捕获摄像头中的人脸,提取人脸特征,通过计算欧氏距离来和预存的人脸特征进行对比,达到人脸识别的目的,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • PyTorch中flatten() 函数的用法实例小结

    PyTorch中flatten() 函数的用法实例小结

    在PyTorch中,flatten函数的作用是将一个多维的张量转换为一维的向量,它可以将任意形状的张量转换为一维,而不需要指定转换后的大小,这篇文章主要介绍了PyTorch中flatten() 函数的用法,需要的朋友可以参考下
    2023-11-11
  • python中Genarator函数用法分析

    python中Genarator函数用法分析

    这篇文章主要介绍了python中Genarator函数用法,实例分析了Genarator函数的使用原理与相关技巧,需要的朋友可以参考下
    2015-04-04
  • python循环控制之break和continue流程控制语句

    python循环控制之break和continue流程控制语句

    这篇文章主要介绍了python循环控制之break流程控制语句,Python中提供了两个关键字用来控制循环语句,分别是break和continue,本文都有介绍,需要的朋友可以参考一下
    2022-03-03
  • Python使用POP3和SMTP协议收发邮件的示例代码

    Python使用POP3和SMTP协议收发邮件的示例代码

    这篇文章主要介绍了Python使用POP3和SMTP协议收发邮件的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Python拆分大型CSV文件代码实例

    Python拆分大型CSV文件代码实例

    这篇文章主要介绍了Python拆分大型CSV文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • python 如何在list中找Topk的数值和索引

    python 如何在list中找Topk的数值和索引

    这篇文章主要介绍了python 如何在list中找Topk的数值和索引的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • PyChon中关于Jekins的详细安装(推荐)

    PyChon中关于Jekins的详细安装(推荐)

    这篇文章主要介绍了PyChon中关于Jekins的详细安装(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论