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