访问asyncio.Queue中的所有元素,而不删除它们

2024-04-26 13:47:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个使用asyncio.Queue的程序。 最好能够清除队列,访问所有排队的元素而不删除它们,并在队列中的“索引1”处插入元素

我知道,这听起来像是collections.deque,但我依赖于异步/等待代码(即blocking 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)

我还遇到了this solution,它访问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)

哪种方法更可取?有更好的方法吗