Напишите класс Loop, являющийся параметрическим декоратором для корутин.
- Задекорированная корутина вызывает исходную многократно; эти повторы назовём «шагами»
На каждом шаге возвращаемое значение исходной корутины опускается — до тех пор, пока оно не окажется равным None, после этого возвращается None.
- Если задекорированных корутин несколько, они отрабатывают свои шаги строго по очереди: один шаг первой корутины, один — второй и т. д. до последней, затем второй шаг первой и т. д.
Как только одна из них возвращает None, все остальные вместо очередного шага тоже сразу возвращают None
- Параметров у класса нет, он используется в качестве пространства имён.
Гарантируется, что в образующий цикл добавлены все задекорированные корутины ровно по одному разу.
1 @Loop()
2 async def getqA(queue):
3 print("A Get", res := await queue.get())
4 return res
5
6 @Loop()
7 async def getqB(queue):
8 print("B Get", res := await queue.get())
9 return res
10
11 async def Run(*coros):
12 queue = asyncio.Queue()
13 for i in list(range(1, 6)) + [None]:
14 await queue.put(i)
15 async with asyncio.TaskGroup() as tg:
16 for coro in coros:
17 tg.create_task(coro(queue))
18
19 asyncio.run(Run(getqA, getqB))
A Get 1 B Get 2 A Get 3 B Get 4 A Get 5 B Get None
