werkzeug(或celery)中关于Proxy的这段注释是什么意思?

发布于 2022-09-03 14:23:32 字数 1241 浏览 15 评论 0

celery的源码local.py中有这么一个类Proxy,作者说是Code stolen from werkzeug.local.Proxy.,我核对了一下,代码确实是一样的,其中有这么一个方法:

def _get_current_object(self):        
    """Return the current object.  This is useful if you want the real       
    object behind the proxy at a time for performance reasons or because     
    you want to pass the object into a different context."""                         
    loc = object.__getattribute__(self, '_Proxy__local')                             
    if not hasattr(loc, '__release_local__'):                                        
        return loc(*self.__args, **self.__kwargs)                                    
    try:  # pragma: no cover                                                         
        # not sure what this is about                                                
        return getattr(loc, self.__name__)                                           
    except AttributeError:  # pragma: no cover                                       
        raise RuntimeError('no object bound to {0.__name__}'.format(self))

注释说这个方法有助于性能提升,还可以在不同的context中的传递对象。

我想问一下,这个函数或者说用Proxy提升性能的原理是什么?

望不吝赐教,谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

飘落散花 2022-09-10 14:23:32

这里题主的理解可能有点问题,作者并没有说提升性能,而是说性能原因,因为 Proxy 是线程隔离的代理,所以当你使用 Proxy 的时候,应用要使用对应的对象,例如 current_app 那么势必被代理一次,获取代理的对象是需要开销的,如果你调用这个方法:_get_current_object 获得真实的对象,那么使用的时候就不会有代理的开销了,这样的话可以说是为了性能原因去调用 _get_current_object

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文