我们从Python开源项目中,提取了以下4个代码示例,用于说明如何使用threading._PyRLock()。
def _green_existing_locks(): """Make locks created before monkey-patching safe. RLocks rely on a Lock and on Python 2, if an unpatched Lock blocks, it blocks the native thread. We need to replace these with green Locks. This was originally noticed in the stdlib logging module.""" import gc import threading import eventlet.green.thread lock_type = type(threading.Lock()) rlock_type = type(threading.RLock()) if sys.version_info[0] >= 3: pyrlock_type = type(threading._PyRLock()) # We're monkey-patching so there can't be any greenlets yet, ergo our thread # ID is the only valid owner possible. tid = eventlet.green.thread.get_ident() for obj in gc.get_objects(): if isinstance(obj, rlock_type): if (sys.version_info[0] == 2 and isinstance(obj._RLock__block, lock_type)): _fix_py2_rlock(obj, tid) elif (sys.version_info[0] >= 3 and not isinstance(obj, pyrlock_type)): _fix_py3_rlock(obj)
def _fix_py3_rlock(old): import gc import threading new = threading._PyRLock() while old._is_owned(): old.release() new.acquire() if old._is_owned(): new.acquire() gc.collect() for ref in gc.get_referrers(old): try: ref_vars = vars(ref) except TypeError: pass else: for k, v in ref_vars.items(): if v == old: setattr(ref, k, new)
def _fix_py3_rlock(old): import gc import threading new = threading._PyRLock() while old._is_owned(): old.release() new.acquire() if old._is_owned(): new.acquire() gc.collect() for ref in gc.get_referrers(old): for k, v in vars(ref): if v == old: setattr(ref, k, new)