threading 官方 线程对象和锁对象以及条件对象condition

官方地址: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 或RLockobject,并用作基础锁。否则,将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()拼写。

你可能感兴趣的:(threading 官方 线程对象和锁对象以及条件对象condition)