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解析文件示例
Jan 23 Python
Python编写屏幕截图程序方法
Feb 18 Python
Python中的各种装饰器详解
Apr 11 Python
详解Python命令行解析工具Argparse
Apr 20 Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
python定时关机小脚本
Jun 20 Python
python实现简单flappy bird
Dec 24 Python
kafka-python批量发送数据的实例
Dec 27 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
文章推荐系统(二)
2006/10/09 PHP
PHP中文汉字验证码
2007/04/08 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
静态页面的值传递(三部曲)
2006/09/25 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
Angular 5.x 学习笔记之Router(路由)应用
2018/04/08 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
python显示生日是星期几的方法
2015/05/27 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
对python调用RPC接口的实例详解
2019/01/03 Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
2019/01/23 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
jupyter 导入csv文件方式
2020/04/21 Python
python脚本定时发送邮件
2020/12/22 Python
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
人力资源管理专业学生自我评价
2013/11/20 职场文书
大学本科毕业生求职信范文
2013/12/18 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
新课培训心得体会
2014/09/03 职场文书
迎新生欢迎词2015
2015/07/16 职场文书