在工作中,我们正在使用gevent创建一些异步服务器,并且关于何时执行与其他模块相关的猴子修补存在一些争论。gevent文档显示了如下内容:
from gevent import monkey
monkey.patch_socket()
import socket在导入库模块之前进行猴子补丁的位置。
然而,我的经理认为猴子修补的顺序应该是这样的:
import socket
from gevent import monkey
monkey.patch_socket()其中,在导入库模块之后调用monkey patching。这使得它看起来像猴子修补看到插座模块已经导入,并在这一点上修补它。
我发现一些讨论说用一种方法做,另一些人说用另一种方法做。我自己的简单测试似乎表明这无关紧要。有没有人对此有什么看法,有明确的原因,或者参考资料会说为什么?
提前感谢!!道格
发布于 2016-09-18 06:40:30
作为gevent的当前维护者,我将指出the documentation,它特别指出(multiple times),推荐的猴子补丁方法是尽可能早地进行,并且最好在任何其他导入之前进行。
现在,对于大多数标准库模块,您可以在导入后进行简单的修补。但是第三方库不一定是安全的。一般来说,它只是更安全,并减少麻烦,猴子补丁尽快。
发布于 2016-09-17 02:09:48
好的,根据源代码(见下文),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存储库中可以看到这一点。
因此,您根本不需要导入套接字(当然,除非您使用它)。
https://stackoverflow.com/questions/39537004
复制相似问题