亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

對(duì)Python的多進(jìn)程鎖的使用方法詳解

 更新時(shí)間:2019年02月18日 14:27:38   作者:田野上的希望  
今天小編就為大家分享一篇對(duì)Python的多進(jìn)程鎖的使用方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

很多時(shí)候,我們需要在多個(gè)進(jìn)程中同時(shí)寫(xiě)一個(gè)文件,如果不加鎖機(jī)制,就會(huì)導(dǎo)致寫(xiě)文件錯(cuò)亂

這個(gè)時(shí)候,我們可以使用multiprocessing.Lock()

我一開(kāi)始是這樣使用的:

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() 

發(fā)現(xiàn)這種方式,鎖并沒(méi)有起作用, 文件內(nèi)容依然出現(xiàn)了錯(cuò)亂(注意,我這里寫(xiě)的1111是示例,我的代碼實(shí)際寫(xiě)的其他內(nèi)容)

所以這種方式,雖然lock通過(guò)參數(shù)傳到了每個(gè)進(jìn)程中,但是我們知道進(jìn)程之間是不共享內(nèi)存的,所以我理解應(yīng)該是每個(gè)進(jìn)程獲得的鎖其實(shí)是不同的, 所以無(wú)法對(duì)寫(xiě)文件起到加鎖的效果

進(jìn)程池是否可行呢,于是做了如下嘗試

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方法會(huì)將data_lst這個(gè)可迭代的對(duì)象里面的每個(gè)元素依次傳入run方法來(lái)執(zhí)行
pool.close()
pool.join()
print 'over'

但是注意:

pool.close()
pool.join()

這兩行代碼必不可少,否則,主進(jìn)程執(zhí)行完畢后會(huì)退出,導(dǎo)致整個(gè)進(jìn)程結(jié)束

所以在整個(gè)進(jìn)程全部執(zhí)行完畢后,才會(huì)打印出over

但是這種方式,發(fā)現(xiàn),鎖仍然不起作用

最后采用了如下方式:

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()

是親測(cè)發(fā)現(xiàn),這種方式,鎖的確起作用了,在每次寫(xiě)入數(shù)據(jù)量很大的情況下,速度很慢

但是一個(gè)比較惡心的問(wèn)題是,我一開(kāi)始試圖將文件打開(kāi)后通過(guò)Process對(duì)象的args參數(shù)傳入到run方法中,但是發(fā)現(xiàn)數(shù)據(jù)無(wú)法寫(xiě)入到文件中,見(jiàn)鬼,這個(gè)問(wèn)題我還沒(méi)搞明白

無(wú)耐,只能采取上面的笨方法,在每次寫(xiě)入的時(shí)候打開(kāi)然后寫(xiě)入,這肯定不是明智的做法,如果有更好的辦法,請(qǐng)留言我

也就是說(shuō),文件打開(kāi)后傳入,是無(wú)效的,那么可以將文件名傳入,然后在run方法中每次寫(xiě)的時(shí)候先打開(kāi),寫(xiě)入后關(guān)閉應(yīng)該也是可行的。

但是為什么我文章采用的第一種方式,也是文件打開(kāi)后傳入,卻是可行的。

以上這篇對(duì)Python的多進(jìn)程鎖的使用方法詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論