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

作者:bluespacezero 时间:2023-09-08 10:20:24 

最近用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多进程写入同一文件的方法

来源:https://blog.csdn.net/Q_AN1314/article/details/51923022

标签:Python,多进程,写入,文件
0
投稿

猜你喜欢

  • 浅谈Python 中整型对象的存储问题

    2021-08-12 10:33:58
  • 详解Python进阶之切片的误区与高级用法

    2022-09-18 04:03:12
  • 基于pygame实现童年掌机打砖块游戏

    2023-09-18 20:41:28
  • 更新修改后的Python模块方法

    2022-02-20 15:34:09
  • Python中Timedelta转换为Int或Float方式

    2021-01-24 19:46:41
  • 10个简化PHP开发的工具

    2023-07-14 18:02:05
  • 人脸检测实战终极之OpenCV+Python实现人脸对齐

    2023-10-01 02:03:07
  • Python调用实现最小二乘法的方法详解

    2022-07-04 16:31:00
  • python编写WAF与Sqlmap结合实现指纹探测

    2022-05-23 08:10:17
  • 无图片CSS圆角的五个实例

    2008-08-02 12:18:00
  • python excel转换csv代码实例

    2023-10-30 15:19:53
  • python装饰器decorator介绍

    2021-12-18 10:56:25
  • 将python字符串转化成长表达式的函数eval实例

    2022-08-25 18:27:23
  • MySQL 查询速度慢的原因

    2024-01-25 01:10:27
  • Oracle 数据库中创建合理的数据库索引

    2009-07-02 12:31:00
  • Python中for后接else的语法使用

    2023-07-08 15:28:47
  • MySQL自定义函数和存储过程示例详解

    2024-01-27 15:25:02
  • sqlserver 存储过程分页(按多条件排序)

    2024-01-23 15:56:31
  • Oracle常见错误代码的分析与解决

    2010-07-26 13:01:00
  • python使用response.read()接收json数据的实例

    2021-09-16 08:08:01
  • asp之家 网络编程 m.aspxhome.com