2011-02-11 6 views
1

나는이 것을 보았다 : http://yukelzon.blogspot.com/2005/07/python-locks.html 파일 쓰기와 관련하여 기존 코드에 잠금을 추가하는 해결책을 찾고있을 때 이것을 보았다. 내 요구에 대한파이썬의 뮤텍스 데코레이터

단순화 된 버전은 다음과 같습니다

def mlock(orig): 
    def inner(*args, **kwargs): 
     Coloring.lock.acquire() 
     try: 
     ret = orig(*args, **kwargs) 
     return ret 
     finally: 
     Coloring.lock.release() 
    return inner 

자물쇠는 클래스 변수입니다. 어떤 사람이 개선이나 더 나은 방법을 생각할 수 있습니까? 파이썬 2.6+ (내 생각)를 사용하는 경우

+0

이 계획인지에 따라 단지 다른 방법을 선언 필요합니다. 응답 된 버전은 python wiki의 세미 공식 버전과 기능면에서 동일합니다. http://wiki.python.org/moin/PythonDecoratorLibrary – user318904

답변

2

, 뮤텍스 오브젝트는 그래서, 상황에 맞는 관리자입니다 :

def mlock(f): 
    def inner(*args, **kwargs): 
     with Coloring.lock: 
      return f(*args, **kwargs) 
    return inner 
0

나는 자유 변수의 팬이 아니에요. Coloring 클래스 변수이기 때문에,

def mlock(Coloring): 
    def mlock_decorator(orig): 
     def inner(*args, **kwargs): 
      Coloring.lock.acquire() 
      try: 
      ret = orig(*args, **kwargs) 
      return ret 
      finally: 
      Coloring.lock.release() 
     return inner 
    return mlock_decorator 

글쎄, 당신이 그 클래스에 꽤 구체적으로 예상되는 경우, 명시 적으로 액세스 : 아마과 같이, 잠금 데코레이터의 명시 적 변수를 만들 것

def mlock(orig): 
    def inner(self, *args, **kwargs): 
     self.Coloring.lock.acquire() 
     try: 
     ret = orig(self, *args, **kwargs) 
     return ret 
     finally: 
     self.Coloring.lock.release() 
    return inner 

은 또는, 적어도, 잠금이 전역 또는 제공 여부에는 "올바른 방법"이 없습니다, 잠금 장치를 액세스하기위한 글로벌

def mlock(orig): 
    global Coloring 
    def inner(*args, **kwargs): 
     Coloring.lock.acquire() 
     try: 
     ret = orig(*args, **kwargs) 
     return ret 
     finally: 
     Coloring.lock.release() 
    return inner