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提升性能的原理是什么?
望不吝赐教,谢谢!
Il peut y avoir quelques problèmes avec la compréhension de la question ici. L'auteur n'a pas parlé d'amélioration des performances, mais de raisons de performances. Parce que
Proxy
est un proxy isolé par thread, donc lorsque vous utilisezProxy
, le L'application doit utiliser les objets correspondants, tels quecurrent_app
, doit être proxy une fois. L'obtention de l'objet proxy nécessite une surcharge. Si vous appelez cette méthode :_get_current_object
pour obtenir l'objet réel, il n'y aura aucune surcharge de proxy lors de son utilisation. . Dans ce cas, on peut dire que_get_current_object
est appelé pour des raisons de performances.