Python threading模块condition原理及运行流程详解


Posted in Python onOctober 05, 2020

Condition的处理流程如下:

首先acquire一个条件变量,然后判断一些条件。

  • 如果条件不满足则wait;
  • 如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。
  • 不断的重复这一过程,从而解决复杂的同步问题。

Condition的基本原理如下:

可以认为Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。

Condition对象的构造函数可以接受一个Lock/RLock对象作为参数,如果没有指定,则Condition对象会在内部自行创建一个RLock。

除了notify方法外,Condition对象还提供了notifyAll方法,可以通知waiting池中的所有线程尝试acquire内部锁。由于上述机制,处于waiting状态的线程只能通过notify方法唤醒,所以notifyAll的作用在于防止有的线程永远处于沉默状态。

演示条件变量同步的经典问题是生产者与消费者问题:假设有一群生产者(Producer)和一群消费者(Consumer)通过一个市场来交互产品。生产者的”策略“是如果市场上剩余的产品少于1000个,那么就生产100个产品放到市场上;而消费者的”策略“是如果市场上剩余产品的数量多余100个,那么就消费3个产品。用Condition解决生产者与消费者问题的代码如下:

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 28 17:15:29 2018

@author: 18665
"""

import threading
import time

class Producer(threading.Thread):
  # 生产者函数
  def run(self):
    global count
    while True:
      if con.acquire():
        # 当count 小于等于1000 的时候进行生产
        if count > 1000:
          con.wait()
        else:
          count = count+100
          msg = self.name+' produce 100, count=' + str(count)
          print(msg)
          # 完成生成后唤醒waiting状态的线程,
          # 从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁
          con.notify()
        con.release()
        time.sleep(1)

class Consumer(threading.Thread):
  # 消费者函数
  def run(self):
    global count
    while True:
      # 当count 大于等于100的时候进行消费
      if con.acquire():
        if count < 100:
          con.wait()
        
        else:
          count = count-5
          msg = self.name+' consume 5, count='+str(count)
          print(msg)
          con.notify()
          # 完成生成后唤醒waiting状态的线程,
          # 从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁
        con.release()
        time.sleep(1)

count = 500
con = threading.Condition()

def test():
  for i in range(2):
    p = Producer()
    p.start()
  for i in range(5):
    c = Consumer()
    c.start()
if __name__ == '__main__':
  test()

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

Python 相关文章推荐
Python下的subprocess模块的入门指引
Apr 16 Python
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
我就是这样学习Python中的列表
Jun 02 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
python打包成so文件过程解析
Sep 28 Python
Python numpy多维数组实现原理详解
Mar 10 Python
python3注册全局热键的实现
Mar 22 Python
python实现坦克大战
Apr 24 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 Python
python 实现关联规则算法Apriori的示例
Sep 30 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
Python urllib库如何添加headers过程解析
Oct 05 #Python
Python3获取cookie常用三种方案
Oct 05 #Python
Python collections.deque双边队列原理详解
Oct 05 #Python
Python全局变量与global关键字常见错误解决方案
Oct 05 #Python
Python定时任务框架APScheduler原理及常用代码
Oct 05 #Python
Python xmltodict模块安装及代码实例
Oct 05 #Python
Python pathlib模块使用方法及实例解析
Oct 05 #Python
You might like
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
2011/12/26 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
使用JQuery在线制作ppt并在线演示源码特效
2015/09/08 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
Python线性回归实战分析
2018/02/01 Python
使用Python读取大文件的方法
2018/02/11 Python
python Opencv将图片转为字符画
2021/02/19 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
python对html过滤处理的方法
2018/10/21 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
python中id函数运行方式
2020/07/03 Python
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
分公司经理岗位职责
2013/11/11 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
餐厅执行经理岗位职责范本
2014/02/26 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
教师查摆问题及整改措施
2014/10/11 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
2014年教研室工作总结
2014/12/06 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
详解nginx location指令
2022/01/18 Servers