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易忽视知识点小结
May 25 Python
Python Web框架Tornado运行和部署
Oct 19 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
详解python3中tkinter知识点
Jun 21 Python
Win10下python 2.7.13 安装配置方法图文教程
Sep 18 Python
10款最好的Python开发编辑器
Jul 03 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
在django中,关于session的通用设置方法
Aug 06 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
解决python3.6用cx_Oracle库连接Oracle的问题
Dec 07 Python
Windows安装Anaconda3的方法及使用过程详解
Jun 11 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设计模式中的工厂模式
2008/06/12 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
php-msf源码详解
2017/12/25 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
js substr支持中文截取函数代码(中文是双字节)
2013/04/17 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
python基础教程之对象和类的实际运用
2014/08/29 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
Python 一句话生成字母表的方法
2019/01/02 Python
python实现最小二乘法线性拟合
2019/07/19 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
python 绘制场景热力图的示例
2020/09/23 Python
5款实用的python 工具推荐
2020/10/13 Python
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
企业管理专业个人求职信范文
2013/09/24 职场文书
毕业生文员求职信
2013/11/03 职场文书
银行演讲稿范文
2014/01/03 职场文书
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
学校副校长四风对照检查材料整改措施
2014/09/25 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
埃及王子观后感
2015/06/16 职场文书
亲戚关系证明
2015/06/24 职场文书
导游词之神仙居景区
2019/11/15 职场文书
话题作文之呼唤
2019/12/18 职场文书
Nginx缓存设置案例详解
2021/09/15 Servers