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中使用wxPython开发的一个简易笔记本程序实例
Feb 08 Python
Python yield 使用方法浅析
May 20 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
Jun 07 Python
Python编程实现蚁群算法详解
Nov 13 Python
Django实现全文检索的方法(支持中文)
May 14 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
Aug 30 Python
python机器人运动范围问题的解答
Apr 29 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
Transpose 数组行列转置的限制方式
Feb 11 Python
python中Ansible模块的Playbook的具体使用
May 28 Python
详细分析Python垃圾回收机制
Jul 01 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 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
php4的session功能评述(一)
2006/10/09 PHP
其他功能
2006/10/09 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
php遍历目录方法小结
2015/03/10 PHP
yii添删改查实例
2015/11/16 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
给Javascript数组插入一条记录的代码
2007/08/30 Javascript
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
js下利用控制器载入对应脚本
2010/07/17 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
浅析Python函数式编程
2018/10/06 Python
Python Pandas分组聚合的实现方法
2019/07/02 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
精油和天然健康美容产品:Art Naturals
2018/01/27 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
简单而又朴实的个人求职信分享
2013/12/12 职场文书
会计学专业学生的求职信范文
2014/01/27 职场文书
群众路线个人整改方案
2014/10/25 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
Django REST framework 限流功能的使用
2021/06/24 Python