Как случайным образом перемешать asyncio.Queue в Python? - PullRequest
0 голосов
/ 14 января 2019

Когда я хочу произвольно перемешать список в Python, я делаю:

from random import shuffle
shuffle(mylist)

Как бы я сделал эквивалент экземпляра asyncio.Queue ? Нужно ли преобразовывать очередь в список, перетасовывать список и затем возвращать их в очередь? Или есть способ сделать это напрямую?

1 Ответ

0 голосов
/ 14 января 2019

Как видно из 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 изменится в будущем таким образом, что проблема будет казаться относительно низкой (по крайней мере, мне).

...