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

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值