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和pygame绘制繁花曲线的方法
Feb 24 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
Python3之不使用第三方变量,实现交换两个变量的值
Jun 26 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
python提取xml里面的链接源码详解
Oct 15 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
python误差棒图errorbar()函数实例解析
Feb 11 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
Mar 30 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
使用Python封装excel操作指南
Jan 29 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 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下把数组保存为文件格式的实例应用
2010/02/08 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
js单例模式的两种方案
2013/10/22 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
AngularJS  双向数据绑定详解简单实例
2016/10/20 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
2019/08/26 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
2019/11/20 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
Django Path转换器自定义及正则代码实例
2020/05/29 Python
Probikekit欧盟:在线公路自行车专家
2019/07/12 全球购物
即兴演讲稿
2014/01/04 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
院系推荐意见
2015/06/05 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
Django程序的优化技巧
2021/04/29 Python
python基础之类属性和实例属性
2021/10/24 Python
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python