我正在使用pyserial通過多處理獲取數據。我分享數據的方式非常簡單。所以:Python:多處理中單鎖的死鎖
我有成員對象在我的課:
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()
,它沒有問題。不知道我是否應該那樣做。
這怎麼可能?難道我做錯了什麼?我期望如果兩個進程都試圖獲得鎖,那麼他們應該阻塞,直到另一個進程解鎖鎖。
你有'shared_lock.acquire()'和'self.shared_result_lock.acquire()'。 「shared_lock」變量是什麼不清楚? – Gerrat
@Gerrat這是與參數相同的鎖。 –