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

2022-10-04 18:06:11 字數 2412 閱讀 9105

很多時候,我們需要在多個程序中同時寫乙個檔案,如果不加鎖機制,就會導致寫檔案錯亂

這個時候,我們可以使用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...