【问题标题】:gevent monkey patching ordergevent猴子补丁顺序
【发布时间】:2017-01-25 00:12:08
【问题描述】:

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

from gevent import monkey
monkey.patch_socket()
import socket

在导入库模块之前进行猴子修补。

但是,我的经理觉得猴子补丁的顺序应该是这样的:

import socket
from gevent import monkey
monkey.patch_socket()

在导入库模块后调用猴子补丁。这使它看起来像猴子修补程序看到套接字模块已被导入,并在此时对其进行修补。

我发现一些讨论说以一种方式去做,而另一些则说以另一种方式去做。我自己的简单测试似乎说没关系。有没有人对此有意见,有一些明确的原因,或说明原因的参考资料?

提前致谢!! 道格

【问题讨论】:

    标签: python gevent monkeypatching


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      作为 gevent 的当前维护者,我将指出 the documentation,其中特别指出 (multiple times) 建议的猴子补丁方法是尽早,并且最好任何其他进口之前。

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

      【讨论】:

      • 感谢您的“大惊小怪”,我已经阅读了该文档几次,但仍然感到困惑,因为我在网上看到的其他示例是这样做的。应该信任文档。 :)
      • 嗨 Jason,请澄清(Linux 上的 Python 3.5.2)有什么问题from gevent.monkey import patch_all; is_module_patched;补丁全部();导入套接字; is_module_patched(socket) =>
      • is_module_patched(modname) 采用模块 name 而不是模块本身。
      • 文档从不证明他们的“尽可能早”的建议是合理的。他们只告诉“如果你在 X、Y 或 Z 奇怪的事情可能发生之后修补它”。你能告诉我们为什么我们应该“尽可能早地”修补而不是“在我们做任何 X、Y、Z 之前”吗?
      • 出现问题的方式有很多种,说“尽早做”比列举修补之前不可能发生的所有可能的事情要容易得多。举个例子,如果任何模块已经完成了“从套接字导入套接字”,那么当你打补丁时,事情就会出错。通常,您不能也不需要知道模块在其内部实现中是否执行“导入套接字”或“从套接字导入套接字”,但如果您在导入后进行修补,则只有其中一个可以正常工作。
      猜你喜欢
      • 2021-04-04
      • 2012-07-14
      • 2012-01-30
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2016-09-01
      • 2012-09-16
      • 2012-12-18
      相关资源
      最近更新 更多