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实现strcmp函数功能示例
Mar 25 Python
Python爬虫框架Scrapy安装使用步骤
Apr 01 Python
python中字典dict常用操作方法实例总结
Apr 04 Python
关于python的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
对python使用http、https代理的实例讲解
May 07 Python
Django框架实现分页显示内容的方法详解
May 10 Python
python  文件的基本操作 菜中菜功能的实例代码
Jul 17 Python
Djang的model创建的字段和参数详解
Jul 27 Python
Django如何使用第三方服务发送电子邮件
Aug 14 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
May 25 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面向对象学习笔记之一 基础概念
2012/10/06 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
php抽象类使用要点与注意事项分析
2015/02/09 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
提高javascript效率 一次判断,而不要次次判断
2012/03/30 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
javascript函数式编程实例分析
2015/04/25 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
python字符串替换示例
2014/04/24 Python
Python中__call__用法实例
2014/08/29 Python
Python虚拟环境项目实例
2017/11/20 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
python 实现屏幕录制示例
2019/12/23 Python
基于python实现模拟数据结构模型
2020/06/12 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
python如何导入依赖包
2020/07/13 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
介绍一下木马病毒的种类
2015/07/26 面试题
文明礼仪小标兵事迹
2014/01/12 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书
2016新年致辞
2015/08/01 职场文书
Nginx解决403 forbidden的完整步骤
2021/04/01 Servers
总结Python连接CS2000的详细步骤
2021/06/23 Python
win10清理dns缓存
2022/04/19 数码科技