首页 > 解决方案 > 如何在 Python 中随机打乱 asyncio.Queue?

问题描述

当我想在 Python 中随机打乱一个列表时,我会这样做:

from random import shuffle
shuffle(mylist)

我将如何做相当于asyncio.Queue的实例?我是否必须将队列转换为列表,随机播放列表,然后将它们放回队列中?或者有没有办法直接做?

标签: queuepython-asyncioshuffle

解决方案


正如您在Queue 源代码中看到的,其中的项目Queue实际上存储在_queue属性中。它可用于Queue通过继承进行扩展:

import asyncio
from random import shuffle


class MyQueue(asyncio.Queue):
    def shuffle(self):
        shuffle(self._queue)


async def main():
    queue = MyQueue()    
    await queue.put(1)
    await queue.put(2)
    await queue.put(3)

    queue.shuffle()

    while not queue.empty():
        item = await queue.get()
        print(item)


if __name__ == '__main__':
    asyncio.run(main())

如果你想洗牌现有的Queue实例,你可以直接这样做:

queue = asyncio.Queue()
shuffle(queue._queue)

出于显而易见的原因,这通常不是一个好的解决方案,但另一方面Queue,未来实现的可能性会以某种方式使其问题看起来相对较低(至少对我而言)。


推荐阅读