是否可以通过 ctypes 获取计数来对 _thread.RLock 执行相同的操作?
是的,这是可能的,因为给出了严格的rlockobject
定义:
import ctypes, _thread
class RLock(_thread.RLock):
offsetof_rlock_count = 32 # on 64-bit system
@property
def count(self):
rlock_count_b = ctypes.string_at(id(self)+self.offsetof_rlock_count, 8)
return int.from_bytes(rlock_count_b, 'little', signed=False)
rlock = RLock()
with rlock:
with rlock:
print(rlock.count)
产量:
2
或更正式的版本:
class S_rlockobject(ctypes.Structure):
_fields_ = [
('ob_refcnt', ctypes.c_ssize_t),
('ob_type', ctypes.c_void_p),
('rlock_lock', ctypes.c_void_p),
('rlock_owner', ctypes.c_long),
('rlock_count', ctypes.c_ulong),
('in_weakreflist', ctypes.c_void_p),
]
class RLock(_thread.RLock):
def __init__(self):
super().__init__()
self._s = S_rlockobject.from_address(id(self))
@property
def count(self):
return self._s.rlock_count
如果可能,该代码是否比上面显示的版本有任何优势?如果有利的话,必须编写什么代码才能访问计数?
两种方法都使用了非公开的API,很难说哪个更好,但我觉得继承纯pythonRLock
实现更简单。性能差异在这里可以忽略不计。