對Python的多進程鎖的使用方法詳解
很多時候,我們需要在多個進程中同時寫一個文件,如果不加鎖機制,就會導致寫文件錯亂
這個時候,我們可以使用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()
發(fā)現(xiàn)這種方式,鎖并沒有起作用, 文件內(nèi)容依然出現(xiàn)了錯亂(注意,我這里寫的1111是示例,我的代碼實際寫的其他內(nèi)容)
所以這種方式,雖然lock通過參數(shù)傳到了每個進程中,但是我們知道進程之間是不共享內(nèi)存的,所以我理解應該是每個進程獲得的鎖其實是不同的, 所以無法對寫文件起到加鎖的效果
進程池是否可行呢,于是做了如下嘗試
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方法來執(zhí)行
pool.close()
pool.join()
print 'over'
但是注意:
pool.close() pool.join()
這兩行代碼必不可少,否則,主進程執(zhí)行完畢后會退出,導致整個進程結束
所以在整個進程全部執(zhí)行完畢后,才會打印出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()
是親測發(fā)現(xiàn),這種方式,鎖的確起作用了,在每次寫入數(shù)據(jù)量很大的情況下,速度很慢
但是一個比較惡心的問題是,我一開始試圖將文件打開后通過Process對象的args參數(shù)傳入到run方法中,但是發(fā)現(xiàn)數(shù)據(jù)無法寫入到文件中,見鬼,這個問題我還沒搞明白
無耐,只能采取上面的笨方法,在每次寫入的時候打開然后寫入,這肯定不是明智的做法,如果有更好的辦法,請留言我
也就是說,文件打開后傳入,是無效的,那么可以將文件名傳入,然后在run方法中每次寫的時候先打開,寫入后關閉應該也是可行的。
但是為什么我文章采用的第一種方式,也是文件打開后傳入,卻是可行的。
以上這篇對Python的多進程鎖的使用方法詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
pyspark給dataframe增加新的一列的實現(xiàn)示例
這篇文章主要介紹了pyspark給dataframe增加新的一列的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
詳解Python中4種超參自動優(yōu)化算法的實現(xiàn)
要想模型效果好,每個算法工程師都應該了解的流行超參數(shù)調(diào)優(yōu)技術。今天給大家總結超參自動優(yōu)化方法:網(wǎng)格搜索、隨機搜索、貝葉斯優(yōu)化?和?Hyperband,感興趣的可以了解一下2022-05-05

