官方地址:​​https://docs.python.org/2/library/threading.html#thread-objects​

以下只截取condition部分,其他Lock()以及threading 部分见上述链接

16.2.4。条件对象

条件变量总是与某种锁定相关联。可以传入,也可以默认创建一个。(当多个条件变量必须共享相同的锁时,传递一个输入很有用。)

条件变量具有​​acquire()​​​和​​release()​​​方法,它们调用关联锁的相应方法。它也有一个​​wait()​​​ 方法,​​notify()​​​和​​notifyAll()​​​方法。只有在调用线程获得了锁时才必须调用这三个对象,否则 ​​RuntimeError​​引发a。

该​​wait()​​​方法释放该锁,然后阻塞直到被a ​​notify()​​​或​​notifyAll()​​另一个线程中的相同条件变量调用唤醒。唤醒后,它将重新获取锁并返回。也可以指定超时。

该​​notify()​​​方法唤醒等待条件变量的线程之一(如果有的话)。该​​notifyAll()​​方法唤醒所有等待条件变量的线程。

注意:​​notify()​​​和​​notifyAll()​​​方法不会释放锁;这意味着被唤醒的一个或多个线程不会​​wait()​​​立即从其调用中返回,而仅在调用​​notify()​​​或​​notifyAll()​​最终放弃了锁所有权的线程时 才会返回 。

提示:使用条件变量的典型编程风格使用锁来同步对某些共享状态的访问;对状态的特定更改感兴趣的线程会​​wait()​​​反复调用,直到它们看到所需的状态为止;而对状态调用进行修改的线程​​notify()​​​或 ​​notifyAll()​​当它们以某种方式改变状态(对于一个侍者来说可能是所需的状态)时,线程将反复调用它们。例如,以下代码是具有无限缓冲区容量的一般生产者-消费者情况:

# Consume one item
cv.acquire()
while not an_item_is_available():
cv.wait()
get_an_available_item()
cv.release()

# Produce one item
cv.acquire()
make_an_item_available()
cv.notify()
cv.release()

要在​​notify()​​​和之间进行选择​​notifyAll()​​,请考虑一种状态更改是否仅对一个或多个等待线程有意义。例如,在典型的生产者-消费者情况下,向缓冲区添加一项仅需要唤醒一个消费者线程。

​threading.​​​​Condition​​([ ] )

如果指定了lock参数,但未指定参数,则该参数​​None​​​必须是a ​​Lock​​​ 或​​RLock​​​object,并用作基础锁。否则,将​​RLock​​创建一个新对象并将其用作基础锁。

​acquire​​(* args 

获取基础锁。此方法在基础锁上调用相应的方法;返回值就是该方法返回的值。

​release​​()

释放基础锁。此方法在基础锁上调用相应的方法;没有返回值。

​wait​​([ 超时] )

等到收到通知或发生超时为止。如果在调用此方法时调用线程未获取锁,​​RuntimeError​​则会引发a。

此方法释放基础锁,然后进行阻塞,直到被a ​​notify()​​​或​​notifyAll()​​在另一个线程中调用相同条件变量唤醒,或者直到发生可选的超时为止。一旦唤醒或超时,它将重新获取锁并返回。

如果存在timeout参数而不是timeout参数​​None​​,则它应该是一个浮点数,以秒为单位(或几分之一)指定操作的超时时间。

当基础锁为时​​RLock​​​,它不会使用其​​release()​​​方法释放,因为当递归获取多次锁时,它实际上可能无法解锁。而是​​RLock​​使用该类的内部接口,即使递归获取了几次,它也可以真正将其解锁。重新获得锁定后,另一个内部接口将用于恢复递归级别。

​notify​​(n = 1 

默认情况下,唤醒一个线程等待这种情况(如果有)。如果在调用此方法时调用线程未获取锁, ​​RuntimeError​​则会引发a。

该方法最多唤醒n个等待条件变量的线程。如果没有线程在等待,则为空操作。

如果至少有n个 线程正在等待,则当前实现将恰好唤醒线程。但是,依靠这种行为并不安全。未来的优化实现有时可能会唤醒 n个以上的线程。

注意:唤醒的线程​​wait()​​​ 直到可以重新获取锁才真正从调用返回。由于​​notify()​​不释放锁,因此它的调用者应该。

​notify_all​​()

​notifyAll​​​()​​¶​

唤醒所有在这种情况下等待的线程。此方法的行为类似于 ​​notify()​​​,但是唤醒所有等待的线程而不是一个。如果在调用此方法时调用线程未获取锁, ​​RuntimeError​​则会引发a。

在2.6版中进行了更改:添加了​​notify_all()​​拼写。