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的推荐方法是尽可能早地完成它,最好在任何其他导入之前完成。
现在,有了大多数标准的库模块,您就可以在它们被导入后通过猴子补丁来摆脱它们。但是第三方图书馆不一定那样安全。一般来说,它只是更安全和减少麻烦猴子补丁尽快。
根据源代码(见下文),
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上的
所以,您根本不需要导入套接字(当然,除非您使用它)。