如何测试gevent monkey patching是否有效?

时间:2013-10-18 18:52:59

标签: gevent

我的图书馆可以测试是否有任何“官方”方式来查看gevent猴子补丁是否已被激活?

3 个答案:

答案 0 :(得分:3)

我不知道官方的方式,但这是一种方式。

注意猴子修补时注意os.fork更改:

>>> import os
>>> os.fork
<built-in function fork>
>>> import gevent.monkey; gevent.monkey.patch_all()
>>> os.fork
<function fork at 0x100535140>

注意gevent.fork是什么:

>>> import gevent
>>> gevent.fork
<function fork at 0x100535140>

所以,当猴子修补所有(或只是操作系统)时:

>>> is_monkeypatched = gevent.fork == os.fork

答案 1 :(得分:2)

请参阅docs

from gevent import monkey

monkey.is_module_patched('socket')

答案 2 :(得分:1)

简短的回答是“不”(显然,如果有的话,人们会期望看到the docs中提供的API。)

更长的答案是“大多数”,使用monkey.saved。检查源代码,您可以看到有效的所有常用修补程序都会通过引用原始项目来更新此字典,因此可以使用monkey.get_original()检索它们。如果您认为官方要求提供文档,那么这不是官方的,但它似乎并不是作为内部API,尽管它没有在monkey.__all__中导出。

如果您的问题意味着“发生了任何猴子修补?”然后你可以测试if monkey.saved: ...

如果你的意思是“模块XXX已被猴子修补?”那么你可以测试适当的名称,例如if "threading" in monkey.saved: ...

作为参考,在monkey.patch_all()完成后你会看到这里的内容。 (请注意,patch_all()实际上不会修补所有内容。默认情况下它会省略subprocess,sys和Event,所以我将它们包含在下面。)

>>> import os, gevent
>>> os.name, gevent.__version__
('posix', '1.0.1')
>>> from gevent import monkey
>>> monkey.patch_all(subprocess=True, sys=True, Event=True)
>>> monkey.saved.keys()
['socket', 'thread', 'ssl', 'gevent.socket', 'subprocess', 'sys', 'threading', 'time', 'os', 'select']