首页 > 其他分享 >线程18

线程18

时间:2023-02-19 14:01:14浏览次数:47  
标签:调用 变量 18 线程 notify 唤醒 底层

条件变量时构建在另一个锁上的同步原语,当需要线程关注特定的状态变化或事件发生时将使用这个锁。典型的用法是生产者与消费者问题,其中一个线程生产的数据提供给另外一个线程使用。

语法:

c=Condition(lock)
穿件新的条件变量。lock时可选的Lock或RLock的实例。如果未提供lock参数,就会创建新的RLock实例供条件变量使用。

常用方法:

c.acquire(*args):获取底层锁。此方法将调用底层锁上对应的acquire(*args)方法。

c.release():释放底层锁。此方法将调用底层锁上对应的release()方法

c.wait(timeout):等待直到获取通知或出现超时为止。此方法在调用线程已经获取锁之后调用。
调用时,将释放底层锁,而且线程将进入睡眠状态,直到另一个线程在条件变量上执行notify()或notify_all()方法将其唤醒为止。
在线程被唤醒后,线程讲重新获取锁,方法也会返回。timeout是浮点数,单位为秒。
如果超时,线程将被唤醒,重新获取锁,而控制将被返回。

c.notify(n):唤醒一个或多个等待此条件变量的线程。此方法只会在调用线程已经获取锁之后调用,
而且如果没有正在等待的线程,它就什么也不做。
n指定要唤醒的线程数量,默认为1.被唤醒的线程在它们重新获取锁之前不会从wait()调用返回。

c.notify_all():唤醒所有等待此条件的线程。

实例模版:使用条件变量

#条件变量实例
from threading import Condition

c=Condition()
def producer():
while True:
c.acquire()
#生产东西
...
c.notify()
c.release()

def consumer():
while True:
c.acquire()
while 没有可用的东西:
c.wait()#等待出现
c.release()
#使用生产的东西
...

注意:如果存在多个线程等待同一个条件,notify()操作会唤醒他们中的一个或多个(这种行为取决于底层的操作系统)。因此,始终有这样的可能:某个线程被唤醒后,缺发现它等待的条件不存在了,这解释了为什么在consumer函数中使用while循环,如果线程醒来,但是生成的项已经消失,它就会回去等待下一个信号。

标签:调用,变量,18,线程,notify,唤醒,底层
From: https://blog.51cto.com/u_15692628/6066718

相关文章

  • uni-app:打包发布部署h5项目(hbuilderx 3.6.18)
    一,基础配置打开项目的manifest.json文件主要是要有appid和应用名称应用版本名称和版号也需要 说明:appid是根据应用名称从在开发者中心中创建的应用列表获取,如果没......
  • uni-app:运行到android真机(hbuilderx 3.6.18)
    一,android手机连接电脑,此处是一台三星note8机器在手机下拉菜单中,选中usb的信息,此处要选择:usb网络共享2,此处要允许usb调试(忘记截图了,从网上借用一张)说明:刘宏缔......
  • 多线程lock 为什么要lock,lock了什么?
    一.为什么要lock,lock了什么?当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待。但当不同的线程都需要访问某个资源的时候,就需要同步......
  • 【多线程与高并发】- synchronized锁的认知
    synchronized锁的认知......
  • linux018之安装mysql
    linux上安装mysql:第一步:查看是否已经安装mariadb,mariadb是mysql数据库的分支,mariadb和mysql一起安装会有冲突,所以需要卸载掉。yumlistinstalled|grepmariadb:查看是......
  • python 进程与线程
    目录进程和线程概念Python中的多进程Python中的多线程多进程还是多线程单线程+异步I/O应用案例例子1:将耗时间的任务放到线程中以获得更好的用户体验。例子2:使用多进程对复......
  • 多线程2
    1、在我们实际使⽤中,线程池的⼤⼩配置多少合适?对于计算密集型,设置线程数=CPU数+1;对于I/O密集型,线程数=CPU数*CPU利⽤率*(任务等待时间/(任务计算时间+1))......
  • 2月18日的java学习
    2月18日的java学习java的类型原则基本类型(除浮点型)逐渐变大之后先float后double,容器逐渐变大低到高为自动,高到低为强制转换过程中会发生内存泄漏,或者精度丢失......
  • 从0到1一步一步玩转openEuler--18 openEuler 管理服务-简介
    18管理服务简介systemd是在Linux下,与SysV和LSB初始化脚本兼容的系统和服务管理器。systemd使用socket和D-Bus来开启服务,提供基于守护进程的按需启动策略,支持快照和系统状......
  • uniapp nvue和vue 全局变量 国际化多语言开发 computed data globalData i18n undefin
    uni-app全局变量的几种实现方式1.公共模块定义一个专用的模块,用来组织和管理这些全局的变量,在需要的页面引入。注意:这种方式只支持多个vue页面或多个nvue页面之间公用,vue......