2013-05-31 21 views
1
def start(self): 
    self.running = True 
    while self.running: 
     pass 

def shut_down(self): 
    self.running = False 

嗨我想知道一个好方法,同步变量运行。我想有快速的解决方案,但我不知道什么是更好的信号量,互斥锁或锁。我认为shut_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() 

回答

1

为了您与像布尔标志一个原始值简单的例子,不需要同步在Python。至少,不在CPython中(可以从python.org下载标准解释器)。

这是因为整个解释器被“全局解释器锁”所覆盖,所以在Python级别一次只能运行一个线程(多个线程可能同时在扩展模块中执行某些操作,如果这些线程模块设置为在适当的时候释放GIL)。因此,当您的工作线程在start函数中循环时检查running属性,可以确保该对象处于健全状态。如果除了shut_down之外的其他代码修改它,您甚至可以确定它将是TrueFalse。因此,如果您打算使用CPython并且坚持使用非常简单的逻辑(比如只有一个线程写入的布尔标志),那么您的第一个示例代码就可以正常工作。

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

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

+0

我想写我自己的迷你服务器与多个客户端。多处理或线程女巫会更好? – Luffy

+0

@Luffy这取决于你最终会等到什么。如果您的服务器正在运行CPU密集型任务,那么您将需要执行多处理,因为它允许Python同时使用多个CPU /内核。另一方面,如果大多数服务器遇到的延迟都与I/O有关(从磁盘读取文件,通过网络发送/接收东西),多线程可能已经足够了。我怀疑多线程的开销和同步成本较低,但如果您不确定,我会测试各种解决方案。 – Blckknght

+0

好的建议。首先,我会尝试使用线程。 – Luffy