1
def start(self):
    self.running = True
    while self.running:
        pass

def shut_down(self):
    self.running = False

嗨,我想知道一种同步变量运行的好方法。我想要快速的解决方案,但我不知道什么是更好的信号量、互斥体或锁。我认为 shutdown_down 不经常使用。

这是我最好的解决方案,但我认为我们可以做得更好。

def start(self):
    self.__lock__.acquire()
    self.running = True
    while self.running:
        self.__lock__.release()
        self.__lock__.acquire()

def shut_down(self):
    self.__lock__.acquire()
    self.running = False
    self.__lock__.release()
4

1 回答 1

1

对于具有像布尔标志这样的原始值的简单示例,在 Python 中不需要同步。至少,不是在 CPython(您可以从 python.org 下载的标准解释器)中。

这是因为整个解释器都被“全局解释器锁”覆盖,因此在 Python 级别一次只能运行一个线程(如果设置了扩展模块,多个线程可能会同时在扩展模块中执行操作)在适当的时候释放 GIL)。因此,当您在函数中循环的工作线程start检查running属性时,可以保证该对象处于正常状态。如果除了 shutdown_down 之外没有其他代码修改它,您甚至可以确定它将是Trueor False

因此,如果您要使用 CPython 并且坚持非常简单的逻辑(例如仅由一个线程写入的布尔标志),那么您的第一个示例代码就可以正常工作。

如果您需要更复杂的逻辑,例如可以由多个线程中的任何一个递增的计数器,那么您将需要一些同步以避免像TOCTTOU这样的竞争条件。

Python 提供的最简单的同步工具之一是module queue它允许线程之间以 FIFO 方式进行同步通信。与较低级别的东西相比,我无法谈论它的性能,但是让代码与队列一起正常工作真的很容易(而手动锁定很容易搞砸,最终导致死锁或竞争条件,这是调试的噩梦) .

于 2013-05-31T23:09:16.103 回答