在工作中我们使用gevent来创建一些异步服务器,并且关于何时执行与其他模块相关的猴子修补存在争议。 gevent文档显示如下内容:
from gevent import monkey
monkey.patch_socket()
import socket
在导入库模块之前发生猴子修补的地方。
然而,我的经理认为猴子补丁的顺序应该是这样的:
import socket
from gevent import monkey
monkey.patch_socket()
导入库模块后调用猴子修补程序。这看起来像猴子修补看到套接字模块已被导入,并在那时修补它。
我发现一些讨论说是以一种方式做,而另一些则说要做另一种。我自己的简单测试似乎说没关系。有没有人对此有任何意见,有一些明确的原因,或者说明为什么会提到?
提前致谢!! 道格
答案 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
存储库中查看。
因此,您根本不需要导入套接字(除非您当然使用它)。