gevent猴子修补顺序

时间:2016-09-16 17:20:44

标签: python gevent monkeypatching

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

from gevent import monkey
monkey.patch_socket()
import socket

在导入库模块之前发生猴子修补的地方。

然而,我的经理认为猴子补丁的顺序应该是这样的:

import socket
from gevent import monkey
monkey.patch_socket()

导入库模块后调用猴子修补程序。这看起来像猴子修补看到套接字模块已被导入,并在那时修补它。

我发现一些讨论说是以一种方式做,而另一些则说要做另一种。我自己的简单测试似乎说没关系。有没有人对此有任何意见,有一些明确的原因,或者说明为什么会提到?

提前致谢!! 道格

2 个答案:

答案 0 :(得分:1)

作为gevent的当前维护者,我将指向the documentation,其中明确指出(multiple times)猴子补丁的推荐方法是尽早 ,最好是之前任何其他导入。

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

答案 1 :(得分:0)

嗯,根据源代码(见下文)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存储库中查看。

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