91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

對Python的多進程鎖的使用方法詳解

發布時間:2020-09-11 21:48:04 來源:腳本之家 閱讀:338 作者:田野上的希望 欄目:開發技術

很多時候,我們需要在多個進程中同時寫一個文件,如果不加鎖機制,就會導致寫文件錯亂

這個時候,我們可以使用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的多進程鎖的使用方法詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文安县| 巩义市| 平南县| 彭泽县| 南川市| 清丰县| 乌审旗| 山阳县| 翁源县| 宁阳县| 葵青区| 年辖:市辖区| 鱼台县| 张掖市| 成武县| 钟祥市| 汉沽区| 饶河县| 扬中市| 布拖县| 怀集县| 永顺县| 鄂州市| 辉县市| 九江县| 宿州市| 克东县| 迁安市| 榆林市| 电白县| 闻喜县| 吴忠市| 平邑县| 历史| 临朐县| 龙泉市| 镇坪县| 栾城县| 大埔县| 华坪县| 铁岭县|