很好的方式(用于CPU)等待Python中的免费锁定

时间:2010-11-03 20:52:25

标签: python multithreading

我有一个名为“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)

我正在寻找的是一种等待锁定获得免费的更好方法。以下内容容易与CPU挂钩,我想避免使用它。

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

更新

我对更好和更好的建议和例子感兴趣更安全的设计来做这种内部过程的沟通和跟踪(例如,列出多个线程的进度)。

2 个答案:

答案 0 :(得分:3)

查看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循环中等待,如果OS线程调度对你不利,它们中的多个可以同时使它脱离循环。

修改

根据khachik的评论更新update以解锁。

答案 1 :(得分:3)

为什么不围绕Python自己的Lock对象包装你的类?然后你不必担心它是如何实现的。它甚至可以充当上下文管理器,因此您可以使用这样的可爱语法:

with myLock:
    doSomething()