1:事件机制共享队列:

利用消息机制在两个队列中,通过传递消息,实现可以控制的生产者消费者问题
要求:readthread读时,writethread不能写;writethread写时,readthread不能读。
基本方法 时间类(Event)
·set:设置事件。将标志位设为True。
wait:等待事件。会将当前线程阻塞,直到标志位变为True。
clear:清除事件。将标志位设为False。
set() clear() 函数的交替执行 也就是消息传递的本质


  1. 模版:
  1. 基本code
  2. # 事件消息机制
  3. import queue
  4. import threading
  5. import random
  6. from threading import Event
  7. from threading import Thread
  8. class WriteThread(Thread):
  9. def __init__(self,q,wt,rt):
  10. super().__init__();
  11. self.queue=q;
  12. self.rt=rt;
  13. self.wt=wt;
  14. def run(self):
  15. self.rt.set()
  16.  
  17. self.wt.wait();
  18. self.wt.clear();
  19.  
  20. class ReadThread(Thread):
  21. def __init__(self,q,wt,rt):
  22. super().__init__();
  23. self.queue=q;
  24. self.rt=rt;
  25. self.wt=wt;
  26. def run(self):
  27. while True:
  28. self.rt.wait();
  29. self.wt.wait();
  30. self.wt.clear()

参考代码:

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Tue Sep 10 20:10:10 2019
  4.  
  5. @author: DGW-PC
  6. """
  7. # 事件消息机制
  8. import queue
  9. import threading
  10. import random
  11. from threading import Event
  12. from threading import Thread
  13.  
  14. class WriteThread(Thread):
  15. def __init__(self,q,wt,rt):
  16. super().__init__();
  17. self.queue=q;
  18. self.rt=rt;
  19. self.wt=wt;
  20. def run(self):
  21. data=[random.randint(1,100) for _ in range(0,10)];
  22. self.queue.put(data);
  23. print("WriteThread写队列:",data);
  24. self.rt.set(); # 发送读事件
  25. print("WriteThread通知读");
  26. print("WriteThread等待写");
  27. self.wt.wait();
  28. print("WriteThread收到写事件");
  29. self.wt.clear();
  30. 6
  31. class ReadThread(Thread):
  32. def __init__(self,q,wt,rt):
  33. super().__init__();
  34. self.queue=q;
  35. self.rt=rt;
  36. self.wt=wt;
  37. def run(self):
  38. while True:
  39. self.rt.wait();# 等待写事件 带来
  40. print("ReadThread 收到读事件");
  41. print("ReadThread 开始读{0}".format(self.queue.get()));
  42. print("ReadThread 发送写事件");
  43. self.wt.set();
  44. self.rt.clear();
  45. q=queue.Queue();
  46. rt=Event();
  47. wt=Event();
  48. writethread=WriteThread(q,wt,rt); # 实例化对象的
  49. readthread=ReadThread(q,wt,rt); # 实例化对象的
  50.  
  51. writethread.start();
  52. readthread.start();

2:条件锁同步生产者消费者

作用: 在保护互斥资源的基础上,增加了条件判断的机制
即为使用wait() 函数 判断不满足当前条件的基础上,让当前线程的阻塞。
其他线程如果生成了满足了条件的资源 使用notify() notifyALl() 函数将刮起线程唤醒。
使用了 threading 的Condition 类
acquire() : 锁住当前资源
relarse() :释放当前锁住的资源
wait:挂起当前线程, 等待唤起 。
• notify:唤起被 wait 函数挂起的线程 。
• notif计All:唤起所有线程,防止线程永远处于沉默状态 。

 
模版:

  1. 基本code
  2. from threading import Thread
  3. from threading import Condition
  4. import random
  5. import time
  6. lock=Condition(); # 声明条件锁
  7. flag=;
  8. def cnsumer():
  9. lock.acquire();
  10. while flag==:
  11. lock.wait();
  12.  
  13. 业务代码---
  14. lock.relarse();
  15.  
  16. def product():
  17. lock.acquire();
  18.  
  19. 释放锁之前对控制变量进行操作,数据的操作控制 可以作为全局变量来锁定
  20. lock.notifyALl();
  21. lock.relarse();

参考代码code:

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Sep 11 21:40:41 2019
  4.  
  5. @author: DGW-PC
  6. """
  7. # 条件锁生产者消费者
  8. from threading import Thread
  9. from threading import Condition
  10. import random
  11. import time
  12.  
  13. flag=0; # 声明控制标志
  14. goods=0; # 事物表示
  15. lock=Condition();
  16. def consumer(x):
  17. global flag;
  18. global goods;
  19. lock.acquire(); # 取得锁
  20. while flag==0: # 便于多次进行消费
  21. print("consumer %d进入等待" % x);
  22. lock.wait();
  23. print("consumer {0}:消费了{1}".format(x,goods));# format 次序从0开始
  24. flag-=1;
  25. lock.release(); #释放锁
  26.  
  27. def product(x):
  28. global flag;
  29. global goods;
  30. time.sleep(3);
  31. lock.acquire();
  32. goods=random.randint(1,1000);
  33. print("product {0} 产生了{1}".format(x,goods));
  34. flag+=1;
  35. lock.notifyAll();
  36. lock.release();
  37.  
  38. threads=[];
  39.  
  40. for i in range(0,2):
  41. t1=Thread(target=consumer,args=(i,));
  42. t2=Thread(target=product,args=(i,));
  43. t1.start();
  44. t2.start();
  45. threads.append(t1);
  46. threads.append(t2);
  47.  
  48. for x in threads:
  49. x.join();

Python的条件锁与事件共享的更多相关文章

  1. python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式

    (1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...

  2. python线程condition条件锁应用实例

    import time import threading # 吃火锅鱼丸 guo = [] suo = threading.Condition() #条件锁 # 生产者负责生产 class Produ ...

  3. python线程条件变量Condition(31)

    对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition. 一.线程条件变 ...

  4. 第十五章、Python多线程同步锁,死锁和递归锁

    目录 第十五章.Python多线程同步锁,死锁和递归锁 1. 引子: 2.同步锁 3.死锁 引子: 4.递归锁RLock 原理: 不多说,放代码 总结: 5. 大总结 第十五章.Python多线程同步 ...

  5. 【python】多进程锁multiprocess.Lock

    [python]多进程锁multiprocess.Lock 2013-09-13 13:48 11613人阅读 评论(2) 收藏 举报  分类: Python(38)  同步的方法基本与多线程相同. ...

  6. 并发编程---线程 ;python中各种锁

    一,概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 --车间负责把资源整合到 ...

  7. 孤荷凌寒自学python第四十天python 的线程锁RLock

     孤荷凌寒自学python第四十天python的线程锁RLock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 因为研究同时在多线程中读写同一个文本文件引发冲突,所以使用Lock锁尝试同步, ...

  8. 孤荷凌寒自学python第三十九天python 的线程锁Lock

    孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...

  9. Python的互斥锁与信号量

    并发与锁 a. 多个线程共享数据的时候,如果数据不进行保护,那么可能出现数据不一致现象,使用锁,信号量.条件锁 b. c.互斥锁1. 互斥锁,是使用一把锁把代码保护起来,以牺牲性能换取代码的安全性,那 ...

随机推荐

  1. 连接查询 变量、if else、while

    连接查询 变量.if else.while   一.连接查询:通过连接运算符可以实现多个表查询. 连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 常用的两个链接运算符: ...

  2. Samba共享文件

    1 安装samba yum install -y samba* 2 添加用户 useradd smbuser 3 设置共享文件用户的密码 smbpasswd -a smbuser 4 创建公共共享文件 ...

  3. SSM案例整合踩的一些坑

    一.出现错误:Cannot convert value of type [java.lang.String] to required type [javax.sql.DataSource] for p ...

  4. div块水平居中,垂直居中

    水平居中一个div想要水平居中于它的父div中只需要给它加css属性margin:0 auto; 即可 <!DOCTYPE html> <html> <head> ...

  5. 设置fiddler抓取安卓手机的包

    1.在手机端设置代理,IP地址为fiddler所在电脑IP,端口默认8888 2.在fiddler上打开工具-设置-连接,勾选允许远程计算机连接,点击确定 3.安装证:手机浏览器输入 http://( ...

  6. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3

    A,有多个线段,求一条最短的线段长度,能过覆盖到所又线段,例如(2,4)和(5,6) 那么我们需要4 5连起来,长度为1,例如(2,10)(3,11),用(3,10) 思路:我们想一下如果题目说的是最 ...

  7. JS表单内容垂直循环滚动

    参考博客:https://blog.csdn.net/yubo_725/article/details/52839493  大佬是真的厉害,保存一下,以方便后续使用 效果: 源码: <!DOCT ...

  8. Java中String直接赋字符串和new String的一些问题

    今天课堂测试做了几道String的练习题,做完直接心态爆炸...... 整理自下面两篇博客: https://www.cnblogs.com/marsitman/p/11248001.html htt ...

  9. System.InvalidOperationException:This.NpgsqlTransaction has completed;it is no longer usable. at Npgsql.NpgsqlTransaction.CheckCompleted() in ...

    关于报此异常,原因是事务不能循环提交,一个方法中事务只能提交一次. System.InvalidOperationException:This.NpgsqlTransaction has comple ...

  10. Linux-正则、grep、sed学习笔记

    一.正则和grep 正则表达式的实现分成了两类: 基本正则表达式(BRE)和扩展的正则表达式(ERE). BRE 和 ERE 之间有什么区别呢?这是关于元字符的问题.BRE 可以辨别以下元字符: ^ ...