关于python:gevent monkey修补顺序

gevent monkey patching order

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

1
2
3
from gevent import monkey
monkey.patch_socket()
import socket

在库模块被导入之前,monkey补丁就发生了。

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

1
2
3
import socket
from gevent import monkey
monkey.patch_socket()

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

我发现有一些讨论说以一种方式做,还有一些讨论说以另一种方式做。我自己的简单测试似乎表明这无关紧要。有人对此有什么看法吗?有什么明确的理由,为什么?有什么人会说为什么?

事先谢谢!!道格


作为gevent的当前维护者,我将指出文档,其中特别指出(多次)Monkey Patch的推荐方法是尽可能早地完成它,最好在任何其他导入之前完成。

现在,有了大多数标准的库模块,您就可以在它们被导入后通过猴子补丁来摆脱它们。但是第三方图书馆不一定那样安全。一般来说,它只是更安全和减少麻烦猴子补丁尽快。


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

1
2
3
4
5
6
7
8
9
10
11
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存储库中可以看到这一点。

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