python为什么要用多进程(对Python的多进程锁的使用方法详解)
python为什么要用多进程
对Python的多进程锁的使用方法详解很多时候,我们需要在多个进程中同时写一个文件,如果不加锁机制,就会导致写文件错乱
这个时候,我们可以使用multiprocessing.Lock()
我一开始是这样使用的:
|
import multiprocessing lock = multiprocessing.Lock() class MatchProcess(multiprocessing.Process): def __init__( self , threadId, mfile, lock): multiprocessing.Process.__init__( self ) self .threadId = threadId self .mfile = mfile self .lock = lock def run( self ): while True : self .lock.acquire() try : self .mfile.write( '111111111111111111' + '\n' ) finally : self .lock.release() if __name__ = = '__main__' : mf = open ( 'test.lst' , 'w' ) for i in range ( 15 ): p = MatchProcess(i, mf, lock) p.start() |
发现这种方式,锁并没有起作用, 文件内容依然出现了错乱(注意,我这里写的1111是示例,我的代码实际写的其他内容)
所以这种方式,虽然lock通过参数传到了每个进程中,但是我们知道进程之间是不共享内存的,所以我理解应该是每个进程获得的锁其实是不同的, 所以无法对写文件起到加锁的效果
进程池是否可行呢,于是做了如下尝试
|
def run(line): lock.acquire() try : mfile.write( '111111111111111111' + '\n' ) finally : lock.release() sf = open ( 'test.lst' , 'r' ) data_lst = list () for line in sf: line = line.strip() data_lst.append(line) pool = Pool( 15 ) pool.map_async(run, data_lst) #map_async方法会将data_lst这个可迭代的对象里面的每个元素依次传入run方法来执行 pool.close() pool.join() print 'over' |
但是注意:
|
pool.close() pool.join() |
这两行代码必不可少,否则,主进程执行完毕后会退出,导致整个进程结束
所以在整个进程全部执行完毕后,才会打印出over
但是这种方式,发现,锁仍然不起作用
最后采用了如下方式:
|
def run(line): mfile = open ( 'test2.lst' , 'a' ) lock.acquire() try : mfile.write( '111111111111111111' + '\n' ) finally : lock.release() sf = open ( 'test.lst' , 'r' ) data_lst = list () for line in sf: line = line.strip() data_lst.append(line) pList = [] for line in line_lst: p = multiprocessing.Process(target = run, args = (line, lock)) p.start() pList.append(p) for p in pList: p.join() |
是亲测发现,这种方式,锁的确起作用了,在每次写入数据量很大的情况下,速度很慢
但是一个比较恶心的问题是,我一开始试图将文件打开后通过Process对象的args参数传入到run方法中,但是发现数据无法写入到文件中,见鬼,这个问题我还没搞明白
无耐,只能采取上面的笨方法,在每次写入的时候打开然后写入,这肯定不是明智的做法,如果有更好的办法,请留言我
也就是说,文件打开后传入,是无效的,那么可以将文件名传入,然后在run方法中每次写的时候先打开,写入后关闭应该也是可行的。
但是为什么我文章采用的第一种方式,也是文件打开后传入,却是可行的。
以上这篇对Python的多进程锁的使用方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/u011734144/article/details/78743240
- python图书管理系统(python面向对象法实现图书管理系统)
- python抖音视频收集(python制作抖音代码舞)
- python怎么设置matlab编程(实例详解Matlab 与 Python 的区别)
- 微信公众号文章 爬虫(python抓取搜狗微信公众号文章)
- python怎么从数组中取内容(python调用c++ ctype list传数组或者返回数组的方法)
- python列表怎么赋值(详解Python列表赋值复制深拷贝及5种浅拷贝)
- python 自定义获取文件目录(Python使用os.listdir和os.walk获取文件路径与文件下所有目录的方法)
- 基于python的加密算法(python实现维吉尼亚加密法)
- python语句三元运算符(Python中三元表达式的几种写法介绍)
- python selenium用法详解(python selenium执行所有测试用例并生成报告的方法)
- python多线程多种方法(详解python多线程之间的同步一)
- 如何用python在微信里自动回复(Python实现微信自动好友验证,自动回复,发送群聊链接方法)
- 学会python一月能赚多少钱(学习python的前途 python挣钱)
- 推荐算法第三方python(GitHub 热门:Python 算法大全,Star 超过 2 万)
- python3循环使用教程(Python3.5常见内置方法参数用法实例详解)
- python面向对象实例教程(Python面向对象程序设计类的多态用法详解)
- 关于队徽 你了解这些么 二(关于队徽你了解这些么)
- 冬天来了手脚冰凉 真不是因为上辈子你是折翼的天使(冬天来了手脚冰凉)
- 0 1 岁婴儿最强作息指南,照着做养出天使宝宝(01岁婴儿最强作息指南)
- 沪上这16所高校 萌新 礼包开箱 哪一款让你心动(沪上这16所高校萌新)
- 她救了被绑架的他,而这一切竟是一场阴谋...(她救了被绑架的他)
- 冬季养殖这6种阴生植物,方便又好养,你家有么(冬季养殖这6种阴生植物)
热门推荐
- .NET中常用的异常类
- docker swarm管理(Docker Swarm 服务编排之命令详解)
- mysql 使用小结(Mysql Online DDL的使用详解)
- 阿里云无法远程连接服务器(解决阿里云ssh远程连接短时间就会断掉的问题)
- windows 10家庭版上安装docker(win10家庭版安装Docker的方法步骤)
- 申请云服务器后需要做哪些(云服务器网站承载量一般有多大?一个云服务器能够放几个网站?)
- 云虚拟主机和普通虚拟主机的区别(云主机为什么要比虚拟主机贵?)
- vue的修饰符都有哪些(详解Vue的sync修饰符)
- php面对对象的三大特性(php中对象引用和复制实例分析)
- sqlserver日期转换(SqlServer 查询时日期格式化语句)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9