在线程中常使用while死循环对消息队列进行扫描,但是如果仅仅使用以下框架,常常会发生断连报错
while True:
try:
# 判断客户端以及读线程是否创建
if self.client is not None and self.client.reader is not None:
# 判断读线程队列消息队列是否创建以及是否为空
if self.client.reader.message_queue is not None and not self.client.reader.message_queue.empty():
# 满足条件数据出队
data = self.client.reader.message_queue.get_nowait()
# 业务处理逻辑
...
原因是因为如果消息队列为空,由于没有处理逻辑,会进行频繁的轮询,导致程序可能会进入一种忙等待的状态,即循环不断地检查队列是否为空,而不是执行其他有用的工作或进入一种休眠状态,这样会让读取线程无法有时间去读取数据到队列中。所以解决方法如下:
while True:
try:
# 判断客户端以及读线程是否创建
if self.client is not None and self.client.reader is not None:
# 判断读线程队列消息队列是否创建以及是否为空
if self.client.reader.message_queue is not None and not self.client.reader.message_queue.empty():
# 满足条件数据出队
data = self.client.reader.message_queue.get_nowait()
# 业务处理逻辑
...
elif self.client.reader.message_queue.empty():
time.sleep(0.2)
在队列为空时让这个线程休眠,从而让出cpu使用权,使得读线程可以读取数据放到消息队列中。