Python 变量循环与同步

Python 变量循环与同步,python,multithreading,python-3.x,synchronization,Python,Multithreading,Python 3.x,Synchronization,嗨,我想知道一个好方法,同步变量运行。我想有一个快速的解决方案,但我不知道什么将是更好的信号量,互斥或锁。我认为关机并不常用 这是我最好的解决方案,但我认为我们可以做得更好 def start(self): self.running = True while self.running: pass def shut_down(self): self.running = False 对于具有布尔标志等基本值的简单示例,Python中不需要同步。至少,不是在

嗨,我想知道一个好方法,同步变量运行。我想有一个快速的解决方案,但我不知道什么将是更好的信号量,互斥或锁。我认为关机并不常用

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

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

def shut_down(self):
    self.running = False

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

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

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

如果您需要更复杂的逻辑,比如计数器可以由多个线程中的任何一个线程递增,那么您将需要一点同步来避免类似这样的争用情况


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

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

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

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

如果您需要更复杂的逻辑,比如计数器可以由多个线程中的任何一个线程递增,那么您将需要一点同步来避免类似这样的争用情况


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

我想编写自己的具有多个客户端的迷你服务器。多处理或线程处理会更好吗?@Luffy这取决于你最终会等待什么。如果您的服务器正在运行CPU密集型任务,那么您将需要进行多处理,因为这允许Python同时使用多个CPU/内核。另一方面,如果服务器遇到的大多数延迟都与I/O有关(从磁盘读取文件、通过网络发送/接收信息),那么多线程可能就足够了。我怀疑多线程有较低的开销和同步成本,但如果您不确定的话,我会测试各种解决方案。我想编写自己的具有多个客户端的迷你服务器。多处理或线程处理会更好吗?@Luffy这取决于你最终会等待什么。如果您的服务器正在运行CPU密集型任务,那么您将需要进行多处理,因为这允许Python同时使用多个CPU/内核。另一方面,如果服务器遇到的大多数延迟都与I/O有关(从磁盘读取文件、通过网络发送/接收信息),那么多线程可能就足够了。我怀疑多线程具有较低的开销和同步成本,但如果您不确定,我会测试各种解决方案。
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()