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实现的可以拷贝或剪切一个文件列表中的所有文件
Apr 30 Python
在Django的视图中使用form对象的方法
Jul 18 Python
python3使用pyqt5制作一个超简单浏览器的实例
Oct 19 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
一篇文章搞定Python操作文件与目录
Aug 13 Python
FFrpc python客户端lib使用解析
Aug 24 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
django模板获取list中指定索引的值方式
May 14 Python
Python logging日志模块 配置文件方式
Jul 12 Python
Python日志器使用方法及原理解析
Sep 27 Python
写好Python代码的几条重要技巧
May 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
一个简单实现多条件查询的例子
2006/10/09 PHP
PHP MVC模式在网站架构中的实现分析
2010/03/04 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
会自动逐行上升的文本框
2006/06/30 Javascript
限制文本框输入N个字符的js代码
2010/05/13 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
python主线程捕获子线程的方法
2018/06/17 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
python实现批量修改文件名
2020/03/23 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
组织关系转移介绍信
2014/01/16 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
新颖的化妆品活动方案
2014/08/21 职场文书
万能检讨书2000字
2014/10/17 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
2014财务年终工作总结
2014/12/08 职场文书
银行自荐信怎么写
2015/03/05 职场文书
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript