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

A. *_*vis 15 python gevent

我有一个依赖的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)

  • 只是一点建议,更Python的方式是:`如果socket.socket是gevent.socket` (2认同)

Wes*_*son 12

afaik gevent.monkey.saveddict仅在修补项目时更新,并且原始文件放在dict中(并且在取消修补时删除),例如

>>> from gevent.monkey import saved
>>> 'sys' in saved
True
Run Code Online (Sandbox Code Playgroud)


Roc*_*ite 5

这是我用于检测 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)