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
=
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();

