当前位置:脚本大全 > > 正文

python为什么要用多进程(对Python的多进程锁的使用方法详解)

时间:2022-03-29 18:30:36类别:脚本大全

python为什么要用多进程

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

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

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

我一开始是这样使用的:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 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通过参数传到了每个进程中,但是我们知道进程之间是不共享内存的,所以我理解应该是每个进程获得的锁其实是不同的, 所以无法对写文件起到加锁的效果

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

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 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'
  • 但是注意:

  • ?
  • 1
  • 2
  • pool.close()
  • pool.join()
  • 这两行代码必不可少,否则,主进程执行完毕后会退出,导致整个进程结束

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

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

    最后采用了如下方式:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 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

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐