我有一个Python单元测试,它取决于multiprocessing
,因此当Gevent的猴子补丁处于活动状态时,它不能运行。是否有Python语句可以告诉我gevent.monkey.patch_all
是否已运行?
答案 0 :(得分:19)
我不确定是否存在惯用方法,但一种简单的方法是检查socket.socket
类:
import gevent.monkey, gevent.socket
gevent.monkey.patch_all()
import socket
if socket.socket is gevent.socket.socket:
print "gevent monkey patch has occurred"
答案 1 :(得分:11)
afaik gevent.monkey.saved
dict仅在修补项目时更新,并且原件放在dict中(并在取消修补时删除),例如。
>>> from gevent.monkey import saved
>>> 'sys' in saved
True
答案 2 :(得分:4)
这是我用来检测gevent猴子补丁是否有效的原因。
def is_gevent_monkey_patched():
try:
from gevent import monkey
except ImportError:
return False
else:
return bool(monkey.saved)
如A. Jesse Jiryu Davis所述,这仅适用于gevent 1.0.x.
更新:在gevent 1.1中有an support API,这有助于了解对象是否已经过猴子修补。所以gevent 1.1的答案可能是:
def is_gevent_monkey_patched():
try:
from gevent import monkey
except ImportError:
return False
else:
return monkey.is_module_patched('__builtin__')
顺便说一句,我发现monkey.is_module_patched('sys')
总是返回False
。通过在运行monkey.saved.keys()
后查看monkey.patch_all()
,我认为只有以下模块可以检查:
['_threading_local', '_gevent_saved_patch_all', 'socket', 'thread', 'ssl',
'signal', '__builtin__', 'subprocess', 'threading', 'time', 'os', 'select']