对Python的多进程锁的使用方法详解

  

很多时候,我们需要在多个进程中同时写一个文件,如果不加锁机制,就会导致写文件错乱

  

这个时候,我们可以使用multiprocessing.Lock ()

  

<强>我一开始是这样使用的:

        进口多处理   锁=multiprocessing.Lock ()   类MatchProcess (multiprocessing.Process):   def __init__(自我、threadId mfile、锁):   multiprocessing.Process.__init__(自我)   自我。threadId=threadId   自我。mfile=mfile   自我。锁=锁   def运行(自我):   而真正的:   self.lock.acquire ()   试一试:   self.mfile。写(' 111111111111111111 ' + ' \ n ')   最后:   self.lock.release ()      if __name__==癬_main__”:   mf=开放(的测试。lst”、“w”)   因为我在范围(15):   p=MatchProcess (mf,我锁)   p.start ()      

发现这种方式,锁并没有起作用,文件内容依然出现了错乱(注意,我这里写的1111是示例,我的代码实际写的其他内容)

  

所以这种方式,虽然锁通过参数传到了每个进程中,但是我们知道进程之间是不共享内存的,所以我理解应该是每个进程获得的锁其实是不同的,所以无法对写文件起到加锁的效果

  

<强>进程池是否可行呢,于是做了如下尝试

        def运行(线):   lock.acquire ()   试一试:   mfile。写(' 111111111111111111 ' + ' \ n ')   最后:   lock.release ()   科幻小说=开放(的考试。lst”、“r”)   data_lst=列表()   在科幻小说:   行=line.strip ()   data_lst.append(线)   池=池(15)   池。map_async(运行、data_lst) # map_async方法会将data_lst这个可迭代的对象里面的每个元素依次传入运行方法来执行   pool.close ()   pool.join ()   打印“超过”      

<>强但是注意:

        pool.close ()   pool.join ()      

这两行代码必不可少,否则,主进程执行完毕后会退出,导致整个进程结束

  

所以在整个进程全部执行完毕后,才会打印出了

  

但是这种方式,发现,锁仍然不起作用

  

<强>最后采用了如下方式:

        def运行(线):   (“test2 mfile=开放。lst ', ' ')   lock.acquire ()   试一试:   mfile。写(' 111111111111111111 ' + ' \ n ')   最后:   lock.release ()      科幻小说=开放(的考试。lst”、“r”)   data_lst=列表()   在科幻小说:   行=line.strip ()   data_lst.append(线)      pList=[]   在line_lst线:   p=多处理。过程(目标=运行参数=(线,锁)   p.start ()   pList.append (p)      p的pList:   p.join ()      

是亲测发现,这种方式,锁的确起作用了,在每次写入数据量很大的情况下,速度很慢

  

但是一个比较恶心的问题是,我一开始试图将文件打开后通过过程对象的arg游戏参数传入到运行方法中,但是发现数据无法写入到文件中,见鬼,这个问题我还没搞明白

  

无耐,只能采取上面的笨方法,在每次写入的时候打开然后写入,这肯定不是明智的做法,如果有更好的办法,请留言我

  

也就是说,文件打开后传入,是无效的,那么可以将文件名传入,然后在运行方法中每次写的时候先打开,写入后关闭应该也是可行的。

  

但是为什么我文章采用的第一种方式,也是文件打开后传入,却是可行的。

  

以上这篇对Python的多进程锁的使用方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

对Python的多进程锁的使用方法详解