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
必须是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()
拼写。
最新文章
- .net 开发---windows服务
- 论文ei,sci检索,JCR-SCI分区,中科院分区连接
- Bootstrap CDN推荐
- 北大poj-1088
- 设计模式--简单工厂(Factory)模式
- 在安卓下使用python连接蓝牙串口模块(HC-06)
- 基于Flume的美团日志收集系统(一)架构和设计【转】
- 11g Rac 切换
- 30款基本UX工具 - 思维流程工具 &; 原型工具
- Best Time to Buy and Sell Stock (java)
- Linux程序设计之shell程序设计
- 由.Net类库提供的农历计算
- ssh 设置私钥实现两台linux主机无密码访问
- float和position
- LOJ#2353 货币兑换
- 使用git遇到的一些问题
- ARC下野指针 EXC_BAD_ACCESS错误
- 2019年Python数据挖掘就业前景前瞻
- StrokesPlus 谷歌搜索结果转https
- 怎么控制contenteditable的输入
热门文章
- 一个扩展搜索API的优化过程
- codeforces 99999/553 Sultan's Pearls Solution 珍珠 题解
- SYZOJP186 你猜猜是不是DP 二分+hash解法
- pycharm+anaconda在Mac上的配置方法 2019.11.29
- pip工具下载速度慢的问题
- [CF2B] The least round way - dp
- MyEclipse-2017破解过程
- 题解 CF171A 【Mysterious numbers - 1】
- numpy 一些知识
- STL-priority_queue H - 看病要排队