一般封装生产者消费者模型的时候会用到 asyncio.Queue,queue 的 put 和 get 操作都是阻塞的(当然可以通过 _nowait 方法改为非阻塞),取数据的时候如果没数据则会一直阻塞。下面通过计数的方法给 asyncio.Queue 添加超时操作:
queue = asyncio.Queue(3)empty_count, max_empty_count, empty_delay = 0, 10, 60while True:if queue.empty():if empty_count > max_empty_count:breakawait asyncio.sleep(empty_delay)empty_count += 1continuedata = await queue.get()# ....这段代码定义了三个变量用于控制队列为空的行为:
empty_count 变量,用于纪录队列为空的次数max_empty_count 常量,表示队列为空的次数的最大值,超过这个值直接 break 退出循环empty_delay 常量或者变量,表示如果本次循环队列为空则等待 empty_delay 秒