gpt4 book ai didi

python - 是否可以在 Python 中子类化 Lock() 对象?如果没有,还有其他调试死锁的方法吗?

转载 作者:太空狗 更新时间:2023-10-29 21:16:16 25 4
gpt4 key购买 nike

所以,我有一个多线程 python 程序,它目前正遭受死锁。我打算通过子类化 threading.Lock 对象来记录锁获取:

import traceback
class DebugLock(threading.Lock):
def acquire(self):
print >>sys.stderr, "acquired", self
#traceback.print_tb
threading.Lock.acquire(self)
def release(self):
print >>sys.stderr, "released", self
#traceback.print_tb
threading.Lock.release(self)

当我尝试运行该程序时,出现以下错误:

    class DebugLock(threading.Lock):
TypeError: Error when calling the metaclass bases
cannot create 'builtin_function_or_method' instances

所以,我的问题是双重的:

  1. 是否可以继承 Lock 对象来完成我正在做的事情?

  2. 如果没有,在 python 中调试死锁的最佳方法是什么?

注意:我没有编写任何 Python 扩展。有一个类似的问题:How to debug deadlock with python?但是,它涉及编译 C++ 代码和使用 GDB,我不能这样做,因为我的代码是纯 python。

最佳答案

您可以只使用“有锁”与“是锁”的方法,如下所示:

import threading, traceback, sys
class DebugLock(object):
def __init__(self):
self._lock = threading.Lock()
def acquire(self):
print("acquired", self)
#traceback.print_tb
self._lock.acquire()
def release(self):
print("released", self)
#traceback.print_tb
self._lock.release()
def __enter__(self):
self.acquire()
def __exit__(self, type, value, traceback):
self.release()

因为您可能想对锁使用 with 语法(谁不想呢?),所以我在其中设置了适当的上下文保护。

用法如下所示:

    >>> lock = DebugLock()    >>> with lock:    ...     print("I'm atomic!")    ...     acquired <__main__.DebugLock object at 0x7f8590e50190>    I'm atomic!    released <__main__.DebugLock object at 0x7f8590e50190>    >>>

关于python - 是否可以在 Python 中子类化 Lock() 对象?如果没有,还有其他调试死锁的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6780613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com