Python:多处理中单个锁的死锁

Python:多处理中单个锁的死锁,python,thread-safety,multiprocessing,mutex,python-3.4,Python,Thread Safety,Multiprocessing,Mutex,Python 3.4,我正在使用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, s

我正在使用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\u my\u stuff
是一个全局函数

现在,零件将填充process函数中的列表:

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()
当len(self.acqBuffer)没有密码时,很难知道代码中是否有其他内容

一种可能是在获取锁后引发异常。尝试在Try/finally子句中包装每个锁定的节。例如

try:
    shared_lock.acquire()
    shared_return_list.extend(acqBuffer)
    del acqBuffer[:]
finally:
    shared_lock.release()
以及:

您甚至可以添加异常子句,并记录引发的任何异常,如果这是问题所在。

如果没有异常,很难知道代码中是否有其他内容

一种可能是在获取锁后引发异常。尝试在Try/finally子句中包装每个锁定的节。例如

try:
    shared_lock.acquire()
    shared_return_list.extend(acqBuffer)
    del acqBuffer[:]
finally:
    shared_lock.release()
以及:


您甚至可以添加异常子句,并记录引发的任何异常,如果这是问题所在。

事实证明这不是死锁。我的错!问题是,从设备上获取的数据有时太大,以至于无法通过计算机复制数据

shared_return_list.extend(acqBuffer)
del acqBuffer[:]

程序冻结需要很长时间。我通过分块移动数据和限制从设备中提取的数据量来解决这个问题。

结果证明这不是死锁。我的错!问题是,从设备上获取的数据有时太大,以至于无法通过计算机复制数据

shared_return_list.extend(acqBuffer)
del acqBuffer[:]

程序冻结需要很长时间。我通过将数据分块移动并限制从设备中提取的数据量来解决这个问题。

您有一个
共享的\u lock.acquire()
和一个
自共享的\u result\u lock.acquire()
。尚不清楚
shared\u lock
变量是什么?@Gerrat它是作为参数传递的同一个锁。您有一个
shared\u lock.acquire()
和一个
self.shared\u result\u lock.acquire()
。尚不清楚
共享锁
变量是什么?@Gerrat它是作为参数传递的同一个锁。+1教我一些我不知道的东西,即如何使用
最终实现“锁保护”。谢谢物理学家:太糟糕了。我真的以为这就是问题所在。如果您能够创建一个其他人可以运行的小示例,则可能会引导您发现问题,或者帮助其他人更好地帮助您。实际上,我的SSCCE没有问题。所以我还在调查是什么引起的。谢谢:)+1教了我一些我不知道的东西,那就是如何用
最终实现一个“锁护”。谢谢物理学家:太糟糕了。我真的以为这就是问题所在。如果您能够创建一个其他人可以运行的小示例,则可能会引导您发现问题,或者帮助其他人更好地帮助您。实际上,我的SSCCE没有问题。所以我还在调查是什么引起的。谢谢:)