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();
6
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=;
def cnsumer():
lock.acquire();
while flag==:
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的条件锁与事件共享的更多相关文章

  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. CSS3 更改字体被选中样式

    CSS3  更改字体被选中样式

  2. Python+Unittest+Requests+PyMysql+HTMLReport 接口自动化框架

    整体框架使用的是:Python+Unittest+Requests+PyMysql+HTMLReport  多线程并发模式 主要依赖模块 Unittest.Requests.PyMysql.HTMLR ...

  3. pycharm连接远程python的开发环境

    一.准备工作 1.远程主机配置python的开发环境(pyenv) 2.本地windowsp安装pycharm 二.配置pycharm连接 配置运行环境:

  4. CentOS 7怎么删除mariadb

    参考链接:https://www.cnblogs.com/ytkah/p/10876824.html

  5. 无需重新安装软件,将软件从C盘移至其他盘(mklink)

    事先说明,这篇博文算是视频的文字转载版,来源为该视频的五分钟后内容→https://www.bilibili.com/video/av78397784/ 如何拯救标红的C盘[高玩] 有时候安装软件会手 ...

  6. [译]Vulkan教程(14)图形管道基础之固定功能

    [译]Vulkan教程(14)图形管道基础之固定功能 Fixed functions 固定功能 The older graphics APIs provided default state for m ...

  7. .net core web api 添加对session跨域实现

    1.配置Startup /ConfigureServices添加: services.AddSession(options => { options.Cookie.Name = ".A ...

  8. Java从入门到精通系统书籍,吐血整理的,只要1元

    思诚为修身之本,而明善又为思诚之本 我会在支付宝联系你 付完款后在支付宝账单详情页 点击联系收款方.我会回复您下载链接.

  9. OC代码规范小记

    代码规范 一:基本代码命名 1.通用原则 尽量清晰又简洁,无法两全时清晰更重要,可读性优先级更高. insertObject:atIndex: 好的 insert:at 坏的 removeObject ...

  10. WPF--事件列表

    事件 描述 Annotation.AnchorChanged 新增.移除或修改 Anchor 元素时发生. Annotation.AuthorChanged 新增.移除或修改 Author 元素时发生 ...