我有一个依赖的Python单元测试multiprocessing,因此当Gevent的猴子补丁处于活动状态时,它不能运行.是否有Python语句可以告诉我是否gevent.monkey.patch_all运行?
Ano*_*rov 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"
Run Code Online (Sandbox Code Playgroud)
Wes*_*son 12
afaik gevent.monkey.saveddict仅在修补项目时更新,并且原始文件放在dict中(并且在取消修补时删除),例如
>>> from gevent.monkey import saved
>>> 'sys' in saved
True
Run Code Online (Sandbox Code Playgroud)
这是我用于检测 gevent 猴子补丁是否处于活动状态的内容。
def is_gevent_monkey_patched():
try:
from gevent import monkey
except ImportError:
return False
else:
return bool(monkey.saved)
Run Code Online (Sandbox Code Playgroud)
正如A. Jesse Jiryu Davis提到的,这仅适用于 gevent 1.0.x。
更新:在 gevent 1.1 中有一个支持 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__')
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我发现monkey.is_module_patched('sys')总是返回False. 通过查看monkey.saved.keys()after running monkey.patch_all(),我认为只有以下模块可以检查:
['_threading_local', '_gevent_saved_patch_all', 'socket', 'thread', 'ssl',
'signal', '__builtin__', 'subprocess', 'threading', 'time', 'os', 'select']
Run Code Online (Sandbox Code Playgroud)