首页 > 解决方案 > 访问 asyncio.Queue 中的所有元素而不删除它们

问题描述

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

我知道,这听起来像collections.deque,但我依赖 async/await 代码(即阻塞 get)。

我的做法:

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)

哪种方法更可取?有没有更好的方法呢?

标签: pythonqueuepython-asynciodeque

解决方案


推荐阅读