Python的条件锁与事件共享详解


Posted in Python onSeptember 12, 2019

1:事件机制共享队列:

利用消息机制在两个队列中,通过传递消息,实现可以控制的生产者消费者问题

要求:readthread读时,writethread不能写;writethread写时,readthread不能读。

基本方法 时间类(Event)

set:设置事件。将标志位设为True。

wait:等待事件。会将当前线程阻塞,直到标志位变为True。

clear:清除事件。将标志位设为False。

set() clear() 函数的交替执行 也就是消息传递的本质

模版:

基本code
# 事件消息机制
import queue
import threading
import random
from threading import Event
from threading import Thread
class WriteThread(Thread):
  def __init__(self,q,wt,rt):
    super().__init__();
    self.queue=q;
    self.rt=rt;
    self.wt=wt;
  def run(self):
     self.rt.set()
     
     self.wt.wait();
     self.wt.clear();
     
class ReadThread(Thread):
  def __init__(self,q,wt,rt):
    super().__init__();
    self.queue=q;
    self.rt=rt;
    self.wt=wt;  
   def run(self):
     while True:
       self.rt.wait();
       self.wt.wait();
       self.wt.clear()

参考代码:

# -*- coding: utf-8 -*-
"""
Created on Tue Sep 10 20:10:10 2019

@author: DGW-PC
"""
# 事件消息机制
import queue
import threading
import random
from threading import Event
from threading import Thread

class WriteThread(Thread):
  def __init__(self,q,wt,rt):
    super().__init__();
    self.queue=q;
    self.rt=rt;
    self.wt=wt;
  def run(self):
    data=[random.randint(1,100) for _ in range(0,10)];
    self.queue.put(data);
    print("WriteThread写队列:",data);
    self.rt.set(); # 发送读事件
    print("WriteThread通知读");
    print("WriteThread等待写");
    self.wt.wait();
    print("WriteThread收到写事件");
    self.wt.clear();
class ReadThread(Thread):
  def __init__(self,q,wt,rt):
    super().__init__();
    self.queue=q;
    self.rt=rt;
    self.wt=wt;
  def run(self):
    while True:
      self.rt.wait();# 等待写事件 带来
      print("ReadThread 收到读事件");
      print("ReadThread 开始读{0}".format(self.queue.get()));
      print("ReadThread 发送写事件");
      self.wt.set();
      self.rt.clear();
q=queue.Queue();
rt=Event();
wt=Event();
writethread=WriteThread(q,wt,rt); # 实例化对象的
readthread=ReadThread(q,wt,rt);  # 实例化对象的

writethread.start();
readthread.start();

2:条件锁同步生产者消费者

作用: 在保护互斥资源的基础上,增加了条件判断的机制

即为使用wait() 函数 判断不满足当前条件的基础上,让当前线程的阻塞。

其他线程如果生成了满足了条件的资源 使用notify() notifyALl() 函数将刮起线程唤醒。

使用了 threading 的Condition 类

acquire() : 锁住当前资源

relarse() :释放当前锁住的资源

wait:挂起当前线程, 等待唤起 。

• notify:唤起被 wait 函数挂起的线程 。

• notif计All:唤起所有线程,防止线程永远处于沉默状态 。

模版:

基本code
from threading import Thread
from threading import Condition
import random
import time
lock=Condition(); # 声明条件锁
flag=0;
def cnsumer():
  lock.acquire();
  while flag==0:
    lock.wait();
  
  业务代码---    
lock.relarse();
   
def product():
  lock.acquire();
  
  释放锁之前对控制变量进行操作,数据的操作控制 可以作为全局变量来锁定
  lock.notifyALl();
  lock.relarse();

参考代码code:

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 11 21:40:41 2019

@author: DGW-PC
"""
# 条件锁生产者消费者
from threading import Thread
from threading import Condition
import random
import time

flag=0; # 声明控制标志
goods=0; # 事物表示
lock=Condition();
def consumer(x):
  global flag;
  global goods;
  lock.acquire(); # 取得锁
  while flag==0: # 便于多次进行消费
     print("consumer %d进入等待" % x);
     lock.wait();
  print("consumer {0}:消费了{1}".format(x,goods));# format 次序从0开始
  flag-=1;
  lock.release(); #释放锁
  
def product(x):
  global flag;
  global goods;
  time.sleep(3);
  lock.acquire();
  goods=random.randint(1,1000);
  print("product {0} 产生了{1}".format(x,goods));
  flag+=1;
  lock.notifyAll();
  lock.release();

threads=[];

for i in range(0,2):
  t1=Thread(target=consumer,args=(i,));
  t2=Thread(target=product,args=(i,));
  t1.start();
  t2.start();
  threads.append(t1);
  threads.append(t2);

for x in threads:
  x.join();

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

Python 相关文章推荐
跟老齐学Python之通过Python连接数据库
Oct 28 Python
Python实现的简单发送邮件脚本分享
Nov 07 Python
python3序列化与反序列化用法实例
May 26 Python
横向对比分析Python解析XML的四种方式
Mar 30 Python
Python切片操作深入详解
Jul 27 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
May 13 Python
Python操作redis和mongoDB的方法
Dec 19 Python
Python动态强类型解释型语言原理解析
Mar 25 Python
python3中布局背景颜色代码分析
Dec 01 Python
python Django框架快速入门教程(后台管理)
Jul 21 Python
Python的互斥锁与信号量详解
Sep 12 #Python
python使用sklearn实现决策树的方法示例
Sep 12 #Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 #Python
Python列表删除元素del、pop()和remove()的区别小结
Sep 11 #Python
python conda操作方法
Sep 11 #Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 #Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 #Python
You might like
优化使用mysql存储session的php代码
2008/01/10 PHP
深入理解php的MySQL连接类
2013/06/07 PHP
php中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
Jquery 设置标题的自动翻转
2009/10/03 Javascript
javascript void(0)的妙用
2009/10/21 Javascript
JavaScript实用技巧(一)
2010/08/16 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
如何利用python查找电脑文件
2018/04/27 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
收入证明怎么写
2015/06/12 职场文书
七年级作文之环保作文
2019/10/17 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL