Event
和 Condition
是threading模块原生提供的模块,原理简单,功能单一,它能发送 True
和 False
的指令,所以只能适用于某些简单的场景中。
而Queue
则是比较高级的模块,它可能发送任何类型的消息,包括字符串、字典等。其内部实现其实也引用了Condition
模块(譬如put
和get
函数的阻塞),正是其对Condition
进行了功能扩展,所以功能更加丰富,更能满足实际应用。
import threading, time class Hider(threading.Thread): def __init__(self, cond, name): super(Hider, self).__init__() self.cond = cond self.name = name def run(self): time.sleep(1) #确保先运行Seeker中的方法 self.cond.acquire() print(self.name + ': 我已经把眼睛蒙上了') self.cond.notify() self.cond.wait() print(self.name + ': 我找到你了哦 ~_~') self.cond.notify() self.cond.release() print(self.name + ': 我赢了') class Seeker(threading.Thread): def __init__(self, cond, name): super(Seeker, self).__init__() self.cond = cond self.name = name def run(self): self.cond.acquire() self.cond.wait() print(self.name + ': 我已经藏好了,你快来找我吧') self.cond.notify() self.cond.wait() self.cond.release() print(self.name + ': 被你找到了,哎~~~') cond = threading.Condition() seeker = Seeker(cond, 'seeker') hider = Hider(cond, 'hider') seeker.start() hider.start() from queue import Queue from threading import Thread import time class Student(Thread): def __init__(self, name, queue): super().__init__() self.name = name self.queue = queue def run(self): while True: # 阻塞程序,时刻监听老师,接收消息 msg = self.queue.get() # 一旦发现点到自己名字,就赶紧答到 if msg == self.name: print("{}:到!".format(self.name)) class Teacher: def __init__(self, queue): self.queue=queue def call(self, student_name): print("老师:{}来了没?".format(student_name)) # 发送消息,要点谁的名 self.queue.put(student_name) queue = Queue() teacher = Teacher(queue=queue) s1 = Student(name="小明", queue=queue) s2 = Student(name="小亮", queue=queue) s1.start() s2.start() print('开始点名~') teacher.call('小明') time.sleep(1) teacher.call('小亮')
输出:
开始点名~ 老师:小明来了没? 小明:到! hider: 我已经把眼睛蒙上了 seeker: 我已经藏好了,你快来找我吧 hider: 我找到你了哦 ~_~ hider: 我赢了 seeker: 被你找到了,哎~~~ 老师:小亮来了没? 小亮:到!