首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gevent猴子补丁顺序

gevent猴子补丁顺序
EN

Stack Overflow用户
提问于 2016-09-17 01:20:44
回答 2查看 2.2K关注 0票数 1

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

代码语言:javascript
复制
from gevent import monkey
monkey.patch_socket()
import socket

在导入库模块之前进行猴子补丁的位置。

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

代码语言:javascript
复制
import socket
from gevent import monkey
monkey.patch_socket()

其中,在导入库模块之后调用monkey patching。这使得它看起来像猴子修补看到插座模块已经导入,并在这一点上修补它。

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

提前感谢!!道格

EN

回答 2

Stack Overflow用户

发布于 2016-09-18 06:40:30

作为gevent的当前维护者,我将指出the documentation,它特别指出(multiple times),推荐的猴子补丁方法是尽可能早地进行,并且最好在任何其他导入之前进行。

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

票数 1
EN

Stack Overflow用户

发布于 2016-09-17 02:09:48

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

代码语言:javascript
复制
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存储库中可以看到这一点。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39537004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档