Python gevent猴子修补令

Python gevent猴子修补令,python,gevent,monkeypatching,Python,Gevent,Monkeypatching,在工作中,我们使用gevent来创建一些异步服务器,关于何时执行与其他模块相关的monkey补丁,存在一些争论。gevent文档显示了如下内容: from gevent import monkey monkey.patch_socket() import socket 在导入库模块之前进行monkey修补 但是,我的经理认为,修补猴子的顺序应该是: import socket from gevent import monkey monkey.patch_socket() 其中,在导入库模块后

在工作中,我们使用gevent来创建一些异步服务器,关于何时执行与其他模块相关的monkey补丁,存在一些争论。gevent文档显示了如下内容:

from gevent import monkey
monkey.patch_socket()
import socket
在导入库模块之前进行monkey修补

但是,我的经理认为,修补猴子的顺序应该是:

import socket
from gevent import monkey
monkey.patch_socket()
其中,在导入库模块后调用monkey patching。这使它看起来像猴子补丁看到插座模块已经被导入,并在这一点上补丁它

我发现一些讨论说用一种方式做,还有一些讨论说用另一种方式做。我自己的简单测试似乎表明这无关紧要。有人对此有什么看法,有什么明确的原因,或者有哪些参考资料可以说明原因

提前谢谢!!
Doug

根据源代码(见下文)
patch_socket
调用
patch_module
,它为您导入
socket
模块

def patch_module(name, items=None):
    gevent_module = getattr(__import__('gevent.' + name), name)
    module_name = getattr(gevent_module, '__target__', name)
    module = __import__(module_name)
    if items is None:
        items = getattr(gevent_module, '__implements__', None)
        if items is None:
            raise AttributeError('%r does not have __implements__' % gevent_module)
    for attr in items:
        patch_item(module, attr, getattr(gevent_module, attr))
    return module
请参见GitHub上的
gevent
存储库


所以,您根本不需要导入套接字(当然,除非您使用它)

作为gevent的当前维护者,我将特别指出()建议使用monkey patch的方法是尽早完成,最好在任何其他导入之前完成


现在,对于大多数标准的库模块,您可以在导入后进行猴子补丁。但第三方图书馆不一定是安全的。一般来说,使用monkey patch会更安全,并且会尽快减少麻烦。

感谢“头朝上打”,我已经阅读了几次该文档,但仍然感到困惑,因为我在网上看到了一些其他的例子。应该信任这些文档。:)嗨,Jason,请澄清gevent.monkey import补丁的错误(linux上的Python 3.5.2);模块是否已打补丁;补丁_all();进口插座;is_module_patched(socket)=>False
is_module_patched(modname)
采用的是模块名称,而不是模块本身。文档从不证明其“尽早”建议的合理性。他们只告诉“如果你在X、Y或Z之后修补它,可能会发生奇怪的事情”。你能告诉我为什么我们应该“尽早”而不是“在我们做任何X、Y、Z之前”进行修补吗?有很多种方式可能会出错,说“尽早做”比列举修补之前不可能发生的所有事情要容易得多。仅举一个例子,如果任何模块已经完成了“从套接字导入套接字”,那么在您进行修补时,就会出现问题。通常,您不能也不需要知道模块是否在其内部实现中“导入套接字”或“从套接字导入套接字”,但如果在导入模块后进行修补,则只有其中一个模块可以正常工作。