国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-16 01:12:23
字體:
來源:轉載
供稿:網友

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

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

我一開始是這樣使用的:

import multiprocessinglock = 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方法中每次寫的時候先打開,寫入后關閉應該也是可行的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石台县| 东丽区| 合肥市| 工布江达县| 工布江达县| 呼伦贝尔市| 新安县| 阜城县| 观塘区| 龙山县| 陇川县| 清流县| 靖江市| 崇文区| 澳门| 杨浦区| 罗平县| 西宁市| 冕宁县| 庆阳市| 阜新| 三门县| 黔江区| 蒙山县| 芦山县| 靖宇县| 西乡县| 观塘区| 北川| 新野县| 太保市| 安西县| 本溪市| 将乐县| 莲花县| 桃源县| 临城县| 威宁| 玉环县| 浦县| 建始县|