view rhodecode/lib/vcs/utils/lazy.py @ 3050:7ae9939409ab beta

Use ThreadLocal storage for dulwich cached repos, finally fixes issues on concurent opening git pack files via dulwich
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 30 Nov 2012 00:09:04 +0100
parents c4d418b440d1
children 79c5967a1e5c
line wrap: on
line source

class LazyProperty(object):
    """
    Decorator for easier creation of ``property`` from potentially expensive to
    calculate attribute of the class.

    Usage::

      class Foo(object):
          @LazyProperty
          def bar(self):
              print 'Calculating self._bar'
              return 42

    Taken from http://blog.pythonisito.com/2008/08/lazy-descriptors.html and
    used widely.
    """

    def __init__(self, func):
        self._func = func
        self.__module__ = func.__module__
        self.__name__ = func.__name__
        self.__doc__ = func.__doc__

    def __get__(self, obj, klass=None):
        if obj is None:
            return self
        result = obj.__dict__[self.__name__] = self._func(obj)
        return result

import threading


class ThreadLocalLazyProperty(LazyProperty):
    """
    Same as above but uses thread local dict for cache storage.
    """

    def __get__(self, obj, klass=None):
        if obj is None:
            return self
        if not hasattr(obj, '__tl_dict__'):
            obj.__tl_dict__ = threading.local().__dict__

        result = obj.__tl_dict__[self.__name__] = self._func(obj)
        return result