2

我的库是否有任何“官方”方式可以测试是否已激活 gevent 猴子补丁?

4

3 回答 3

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
于 2013-11-17T04:01:52.297 回答
2

请参阅文档

from gevent import monkey

monkey.is_module_patched('socket')
于 2016-05-20T08:43:44.093 回答
1

简短的回答是“不”(显然,如果有的话,人们会期望看到文档中提供的 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']
于 2015-03-01T14:50:23.503 回答