Написать класс Portal, который работает так же, как Barrier, однако дополнительно имеет property .topic. Этот дескриптор по умолчанию равен None, однако вызов .wait(топик) с не-None параметром его меняет на топик. Главное свойство Portal состоит в том, что к моменту «прохождения портала» любым его клиентом значение topic должно быть равно заданному.
Предполагается, что из клиентов только один задаёт топик, остальные не меняют его (например, передают None)
1 import asyncio
2 async def task(p, topic=None):
3 await p.wait(topic)
4 print(p.topic)
5
6 async def runner(N):
7 p = Portal(N)
8 for j in range(3):
9 async with asyncio.TaskGroup() as tg:
10 for i in range(N):
11 tg.create_task(task(p, f"FLAG{j}" if i == N // 2 else None))
12 await p.reset()
13
14 asyncio.run(runner(5))
В тестах будут проверяться некоторые свойства Barrier, так что лучше от него унаследоваться
Подсказка: тамбур имеет вход и выход ☺
(нажмите «Комментарии» в шапке страницы, чтобы прочитать спойлер)
FLAG0 FLAG0 FLAG0 FLAG0 FLAG0 FLAG1 FLAG1 FLAG1 FLAG1 FLAG1 FLAG2 FLAG2 FLAG2 FLAG2 FLAG2
