【发布时间】:2016-06-10 16:30:01
【问题描述】:
我有这个实现:
def mlock(f):
'''Method lock. Uses a class lock to execute the method'''
def wrapper(self, *args, **kwargs):
with self._lock:
res = f(self, *args, **kwargs)
return res
return wrapper
class Lockable(object):
def __init__(self):
self._lock = threading.RLock()
我在几个地方都用过,例如:
class Fifo(Lockable):
'''Implementation of a Fifo. It will grow until the given maxsize; then it will drop the head to add new elements'''
def __init__(self, maxsize, name='FIFO', data=None, inserted=0, dropped=0):
self.maxsize = maxsize
self.name = name
self.inserted = inserted
self.dropped = dropped
self._fifo = []
self._cnt = None
Lockable.__init__(self)
if data:
for d in data:
self.put(d)
@mlock
def __len__(self):
length = len(self._fifo)
return length
...
该应用程序相当复杂,但运行良好。只是为了确保,我一直在对正在运行的服务进行压力测试,我发现它有时(很少)在mlock 中死锁。我假设另一个线程正在持有锁而不是释放它。我该如何调试呢?请注意:
- 很难重现:我需要数小时的测试才能死锁
- 应用程序正在后台运行
- 一旦死锁,我就不能再与之交互了
我想知道:
- 哪个线程持有锁?
- 为什么不发布?我正在使用上下文管理器来获取锁,所以它应该总是被释放。错误在哪里?!
我有哪些选项可以进一步调试?
我一直在检查是否有任何方法可以知道哪个线程持有RLock,但似乎没有用于此的 API。
【问题讨论】:
标签: python multithreading deadlock