[英]Python: Deadlock of a single lock in multiprocessing
我正在使用pyserial通過多處理獲取數據。 我共享數據的方式非常簡單。 所以:
我班上有成員對象:
self.mpManager = mp.Manager()
self.shared_return_list = self.mpManager.list()
self.shared_result_lock = mp.Lock()
我這樣稱呼我的多處理過程:
process = mp.Process(target=do_my_stuff,
args=(self.shared_stopped, self.shared_return_list, self.shared_result_lock)
)
其中do_my_stuff
是全局函數。
現在,該部分將填充過程功能列表:
if len(acqBuffer) > acquisitionSpecs["LengthToPass"]:
shared_lock.acquire()
shared_return_list.extend(acqBuffer)
del acqBuffer[:]
shared_lock.release()
將其帶到本地線程使用的部分是:
while len(self.acqBuffer) <= 0 and (not self.stopped):
#copy list from shared buffer and empty it
self.shared_result_lock.acquire()
self.acqBuffer.extend(self.shared_return_list)
del self.shared_return_list[:]
self.shared_result_lock.release()
問題 :
盡管只有1個鎖,但是我的程序有時還是以某種方式死於死鎖! 等待一段時間后,我的程序凍結。 在鎖之前和之后添加打印后,我發現它在鎖處凍結並以某種方式達到死鎖。
如果我使用遞歸鎖RLock()
,它將正常工作。 不知道我是否應該這樣做。
這怎么可能? 難道我做錯了什么? 我希望如果兩個進程都試圖獲取該鎖,它們應該阻塞直到另一個進程解鎖該鎖。
如果沒有SSCCE ,很難知道代碼中是否還有其他內容。
一種可能性是在獲取鎖后會引發異常。 嘗試將每個鎖定的節包裝在try / finally子句中。 例如。
try:
shared_lock.acquire()
shared_return_list.extend(acqBuffer)
del acqBuffer[:]
finally:
shared_lock.release()
和:
try:
self.shared_result_lock.acquire()
self.acqBuffer.extend(self.shared_return_list)
del self.shared_return_list[:]
finally:
self.shared_result_lock.release()
您甚至可以添加異常子句,並記錄引發的所有異常(如果這確實是問題所在)。
事實證明這不是僵局。 我的錯! 問題是從設備獲取的數據有時非常龐大,以至於無法通過
shared_return_list.extend(acqBuffer)
del acqBuffer[:]
該程序凍結需要很長時間。 我通過逐塊移動數據並限制要從設備中提取的數據量來解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.