代码之家  ›  专栏  ›  技术社区  ›  andyortlieb

在Python中等待空闲锁的好方法(对于CPU)

  •  0
  • andyortlieb  · 技术社区  · 14 年前

    我有一个名为“lockingValue”的泛型类,可以被多个线程引用。这是为了防止种族状况。

    class lockingValue(object):
        def __init__(self,value=None):
            self._locked=False
            self._value=value
    
        def _lock(self):
            while self._locked:
                pass
            self._locked = True
    
        def _unlock(self):
            self._locked = False
    
        def update(self,val):
            self._lock()
            self._value=val
    
        def value(self):
            return copy.copy(self._value)
    

        def _lock(self):
            while self._locked:
                pass
            self._locked = True
    

    更新:

    2 回复  |  直到 14 年前
        1
  •  3
  •   DNS    14 年前

    为什么不把你的类包装在Python自己的 Lock 反对?那你就不用担心它是如何实现的了。它甚至充当上下文管理器,因此您可以使用如下可爱的语法:

    with myLock:
        doSomething()
    
        2
  •  3
  •   user470379    14 年前

    threading.Lock() .

    import threading
    
    class lockingValue(object):
        def __init__(self,value=None):
            self._lock = threading.Lock()
            self._value = value
    
        def _lock(self):
            self._lock.acquire()
    
        def _unlock(self):
            self._lock.release()
    
        def update(self, val):
            self._lock()
            self._value = val
            self._unlock()
    
        def value(self):
            return copy.copy(self._value)
    

    你的代码现在就在你的 _lock 方法时,可能有多个线程在while循环中等待,如果操作系统线程调度与您合谋,则其中多个线程可能同时退出循环。

    更新 update 根据卡奇克的评论完成后解锁。