python 消息队列忙等待(消息队列无法取数据)问题

84 阅读1分钟

在线程中常使用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使用权,使得读线程可以读取数据放到消息队列中。