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 相关文章推荐
关于你不想知道的所有Python3 unicode特性
Nov 28 Python
python的类方法和静态方法
Dec 13 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
基于python绘制科赫雪花
Jun 22 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
python生成器推导式用法简单示例
Oct 08 Python
使用python去除图片白色像素的实例
Dec 12 Python
Python爬取365好书中小说代码实例
Feb 28 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
python中threading开启关闭线程操作
May 02 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
Python在字符串中处理html和xml的方法
Jul 31 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
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
开启PHP的伪静态模式
2015/12/31 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
Java模拟试题
2014/11/10 面试题
高三生物教学反思
2014/01/25 职场文书
化妆品店促销方案
2014/02/24 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
谢师宴邀请函
2015/02/02 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
Redis的字符串是如何实现的
2021/10/24 Redis