【Python】aio Queue 的超时封装

一般封装生产者消费者模型的时候会用到 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()
	# ....

这段代码定义了三个变量用于控制队列为空的行为:

  1. empty_count 变量,用于纪录队列为空的次数
  2. max_empty_count 常量,表示队列为空的次数的最大值,超过这个值直接 break 退出循环
  3. empty_delay 常量或者变量,表示如果本次循环队列为空则等待 empty_delay

你可能感兴趣的:(Python,python)