python - 访问 asyncio.Queue 中的所有元素而不删除它们
问题描述
我正在开发一个使用asyncio.Queue的程序。如果能够清除队列,访问所有排队的元素而不删除它们,并在队列中的“索引 1”处插入元素,那就太好了。
我知道,这听起来像collections.deque,但我依赖 async/await 代码(即阻塞 get)。
我的做法:
clear
:从队列中删除所有元素,直到它为空。get_all
:删除元素,添加到列表,再次排队元素,重复qsize()
次数。返回列表。appendleft
:队列元素。然后从/到队列中删除和追加qsize() - 1
元素,直到
class BlockingDeque(asyncio.Queue):
def clear(self):
while not self.empty():
self.get_nowait()
self.task_done()
def get_all(self):
all = []
for i in range(self.qsize()):
item = self.get_nowait()
self.task_done()
self.put_nowait(item)
all.append(item)
return all
async def appendleft(self, item):
await self.put(item)
for _ in range(self.qsize() - 1):
item = self.get_nowait()
self.task_done()
self.put_nowait(item)
我也遇到了这个解决方案,它可以访问asyncio.Queue().__dict__['_queue']
.
class BlockingDeque(asyncio.Queue):
def clear(self):
self._queue.clear()
def get_all(self):
return self._queue.copy()
def appendleft(self, x):
self._queue.appendleft(x)
哪种方法更可取?有没有更好的方法呢?
解决方案
推荐阅读
- kotlin - 将依赖项从模块传递到继承的父模块
- gitlab - Gitlab 执行器 TTY
- docker - Traefik Docker Swarm 基本身份验证
- svg - 如何应用 SVG 过滤器来创建整个轮廓的彩色 SVG 形式?
- corda - 扩展 FungibleToken 时出错:QueryableState 中的 supportedSchemas() 与 FungibleState 中的 supportedSchemas() 冲突
- python - 如何在 Python CDK 中实例化 CfnFunction 的 events 参数
- c# - 连续调用 Console.Beep() 之间的延迟
- python - 在 AWS Lambda 中收到错误“无法导入模块 'lambda_function':没有名为 Flask 的模块”
- mongodb - 如何一次从多个 Mongo 集合中查询(查找)并组合结果
- javascript - 在 componentDidMount() 中使用 React.setState 获取嵌套承诺中返回的数据?