簡體   English   中英

Python:多處理中單個鎖的死鎖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM