使用List来模拟消息队列,一端用来存消息,另一端用来取消息,分别有阻塞和非阻塞实现
时间: 2023-07-15 12:13:00 浏览: 91
消息的发送与接收的模拟实现
使用List来模拟消息队列,一端用来存消息,另一端用来取消息,可以使用Python内置的List数据结构实现。下面分别介绍阻塞和非阻塞的实现方式:
阻塞实现:
```python
from threading import Lock
class MessageQueue:
def __init__(self):
self.queue = []
self.lock = Lock()
def put(self, message):
with self.lock:
self.queue.append(message)
self.lock.notify() # 通知一个等待的线程
def get(self):
with self.lock:
while len(self.queue) == 0:
self.lock.wait() # 等待通知
return self.queue.pop(0)
```
在阻塞实现中,使用了Python内置的Lock和Condition变量来实现线程的同步和通信。当put方法添加一个消息时,会使用Lock进行互斥保护,防止多个线程同时修改队列,同时还会使用Condition变量的notify方法通知一个等待的线程。当get方法取消息时,如果队列为空,会使用Condition变量的wait方法进入阻塞状态,直到put方法通知。
非阻塞实现:
```python
from queue import Queue, Empty
class MessageQueue:
def __init__(self):
self.queue = Queue()
def put(self, message):
self.queue.put(message)
def get(self, block=True, timeout=None):
try:
return self.queue.get(block=block, timeout=timeout)
except Empty:
return None
```
在非阻塞实现中,使用了Python内置的Queue数据结构来实现消息队列。当put方法添加一个消息时,会直接调用Queue的put方法。当get方法取消息时,如果队列为空,会通过捕获Empty异常来返回None,实现非阻塞的效果。可以通过设置block参数来控制是否阻塞,timeout参数来控制阻塞的超时时间。
阅读全文