Python多进程写入同一文件
来源:互联网 发布:校园网络组建方案 编辑:程序博客网 时间:2024/05/27 14:13
最近用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 Poolimport timedef mycallback(x): with open('123.txt', 'a+') as f: f.writelines(str(x))def sayHi(num): return numif __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学习多进程并发写入同一文件
- 多个进程对同一文件写入的问题
- 多进程写入文件
- java多线程写入同一文件
- 对同一文件进行多线程写入
- 多进程、多线程并发写同一log文件问题
- 多个进程访问同一文件的解决方法
- python文件的写入
- python 写入文件
- python csv文件写入
- Python 写入XML 文件
- python读取写入文件
- python 写入文件
- python换行写入文件
- Python读取写入文件
- python 写入csv文件
- c语言中的bool
- Spring Boot实战之Filter实现使用JWT进行接口认证
- CCTYPE函数系列
- 树(4)判断某个序列是否是二叉查找树的后序遍历结果
- Laravel 4 系列入门教程(三)
- Python多进程写入同一文件
- OpenCV优化:图像的遍历4种方式
- STM32学习笔记之ADC转换
- Java容器小结和使用示例
- 系统架构师谈企业应用架构之系统建模4(1)
- Android动画之视图动画
- 如何在HTML5中使用SVG
- git终端命令
- android项目之记事本-1(已上线)