Python线程条件变量Condition原理解析


Posted in Python onJanuary 20, 2020

这篇文章主要介绍了Python线程条件变量Condition原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Condition 对象就是条件变量,它总是与某种锁相关联,可以是外部传入的锁或是系统默认创建的锁。当几个条件变量共享一个锁时,你就应该自己传入一个锁。这个锁不需要你操心,Condition 类会管理它。

acquire() 和 release() 可以操控这个相关联的锁。其他的方法都必须在这个锁被锁上的情况下使用。wait() 会释放这个锁,阻塞本线程直到其他线程通过 notify() 或 notify_all() 来唤醒它。一旦被唤醒,这个锁又被 wait() 锁上。

经典的 consumer/producer 问题的代码示例为:

import threading
import time
import logging

logging.basicConfig(level=logging.DEBUG,
          format='(%(threadName)-9s) %(message)s',)

def consumer(cv):
  logging.debug('Consumer thread started ...')
  with cv:
    logging.debug('Consumer waiting ...')
    cv.acquire()
    cv.wait()
    logging.debug('Consumer consumed the resource')
    cv.release()

def producer(cv):
  logging.debug('Producer thread started ...')
  with cv:
    cv.acquire()
    logging.debug('Making resource available')
    logging.debug('Notifying to all consumers')
    cv.notify()
    cv.release()

if __name__ == '__main__':
  condition = threading.Condition()
  cs1 = threading.Thread(name='consumer1', target=consumer, args=(condition,))
  #cs2 = threading.Thread(name='consumer2', target=consumer, args=(condition,state))
  pd = threading.Thread(name='producer', target=producer, args=(condition,))

  cs1.start()
  time.sleep(2)
  #cs2.start()
  #time.sleep(2)
  pd.start()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取局域网占带宽最大3个ip的方法
Jul 09 Python
python之Socket网络编程详解
Sep 29 Python
Python3 Random模块代码详解
Dec 04 Python
简单了解Django模板的使用
Dec 20 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
Apr 18 Python
django反向解析URL和URL命名空间的方法
Jun 05 Python
Python数据持久化shelve模块用法分析
Jun 29 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 Python
使用Python完成15位18位身份证的互转功能
Nov 06 Python
Django接收照片储存文件的实例代码
Mar 07 Python
tensorflow tf.train.batch之数据批量读取方式
Jan 20 #Python
Python list运算操作代码实例解析
Jan 20 #Python
Python模块future用法原理详解
Jan 20 #Python
使用Tensorflow将自己的数据分割成batch训练实例
Jan 20 #Python
Python JSON编解码方式原理详解
Jan 20 #Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 #Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
Jan 20 #Python
You might like
Zend的AutoLoad机制介绍
2012/09/27 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
零基础学JavaScript最新动画教程+iso光盘下载
2008/01/22 Javascript
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
JS获取url参数、主域名的方法实例分析
2016/08/03 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
JavaScript数组push方法使用注意事项
2017/10/30 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python实现周期性抓取网页内容的方法
2015/11/04 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
增大python字体的方法步骤
2020/07/05 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
道路建设实施方案
2014/03/18 职场文书
债务纠纷起诉书
2015/05/20 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js