如何检测Gevent的猴子补丁是否有效?

时间:2014-07-16 01:10:55

标签: python gevent

我有一个Python单元测试,它取决于multiprocessing,因此当Gevent的猴子补丁处于活动状态时,它不能运行。是否有Python语句可以告诉我gevent.monkey.patch_all是否已运行?

3 个答案:

答案 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']