很多時候,我們需要在多個程序中同時寫乙個檔案,如果不加鎖機制,就會導致寫檔案錯亂
這個時候,我們可以使用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 = mfil程式設計客棧e
self.lock = lock
def run(self):
while true:
self.lock.acquire()
try:
self.mfifpytmascbfle.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的多程序鎖的使用方法詳解
本文位址:
多程序中的程序鎖(互斥鎖)
以下例項中 import threading lock threading.lock num 0def work1 asd global num for i in range asd num 1print 在當前的執行緒修改過後的num是 num defwork2 asd global num fo...
python多程序的坑 Python多程序相關的坑
python的multiprocessing模組實現了多程序功能,但官方文件上只有一些比較簡單的用法,主要是使用函式作為process的target,而如何在class中使用多程序並沒有多講解。google出兩篇比較詳細的文章,建議從它們入門 下面記錄一下自己這週在python多程序上碰到的坑 建立...
python使用多程序
python多執行緒適合io密集型場景,而在cpu密集型場景,並不能充分利用多核cpu,而協程本質基於執行緒,同樣不能充分發揮多核的優勢。針對計算密集型場景需要使用多程序,python的multiprocessing與threading模組非常相似,支援用程序池的方式批量建立子程序。只需要例項化pr...