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 相关文章推荐
pyqt4教程之messagebox使用示例分享
Mar 07 Python
windows下wxPython开发环境安装与配置方法
Jun 28 Python
python多线程操作实例
Nov 21 Python
解决Django migrate No changes detected 不能创建表的问题
May 27 Python
python实现列表中最大最小值输出的示例
Jul 09 Python
Django logging配置及使用详解
Jul 23 Python
python的移位操作实现详解
Aug 21 Python
python 函数中的参数类型
Feb 11 Python
python3 xpath和requests应用详解
Mar 06 Python
如何提高python 中for循环的效率
Apr 15 Python
python定义具名元组实例操作
Feb 28 Python
python基础之文件操作
Oct 24 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 单引号与双引号的区别
2009/11/24 PHP
获取URL文件名后缀
2013/10/24 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
vue同个按钮控制展开和折叠同个事件操作
2020/07/29 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
Python实现翻转数组功能示例
2018/01/12 Python
python如何读写csv数据
2018/03/21 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
商务日语专业毕业生求职信
2013/10/26 职场文书
学术会议欢迎词
2014/01/09 职场文书
咖啡蛋糕店创业计划书
2014/01/28 职场文书
八月迷情观后感
2015/06/11 职场文书
党员读书活动心得体会
2016/01/14 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
Python操作CSV格式文件的方法大全
2021/07/15 Python
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android