官方地址: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
必须是aLock
或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 个线程。但是,依靠这种行为并不安全。未来的优化实现有时可能会唤醒 n个以上的线程。
-
notify_all
() -
notifyAll
()¶ -
唤醒所有在这种情况下等待的线程。此方法的行为类似于
notify()
,但是唤醒所有等待的线程而不是一个。如果在调用此方法时调用线程未获取锁,RuntimeError
则会引发a。在2.6版中进行了更改:添加了
notify_all()
拼写。
-