Написать класс NotifyEvent (унаследованный от asyncio.Event) со следующими свойствами
В методе оповещение.set(имя) присутствует строка-имя адресата уведомления, но по умолчанию это None
Перед каждым оповещение.set() (кроме самого первого) требуется вызов оповещение.clear()
Метод await оповещение.wait() возвращает имя адресата уведомления (но в остальном работает как event.wait())
Написать также сопрограмму task(имя, оповещение) со следующими свойствами:
Если уведомление «своё» — адресат уведомления совпадает с именем, — выводится имя, количество принятых «своих» уведомлений и количество принятых «чужих» уведомлений
Если вместо имени await оповещение.wait() вернул None, работа завершается
Использовать внутреннюю реализацию asyncio.Event в этой задаче нельзя
1 async def sender(names, notify):
2 for name in names:
3 notify.set(name)
4 await asyncio.sleep(0.1)
5 notify.clear()
6 notify.set()
7
8 async def main():
9 notify = NotifyEvent()
10 tasks = {n: task(n, notify) for n in "12"}
11 targets = "1", "2", "2", "2", "2", "1", "2", "1", "1"
12 await asyncio.gather(*(list(tasks.values()) + [sender(targets, notify)]))
13
14 asyncio.run(main())
Подсказка: я для решения завёл ещё одно событие внутри Notify — иначе в промежуток между .set() и .clear() насыпаются бесконечные успешные .wait()
1: 1 / 0 2: 1 / 1 2: 2 / 1 2: 3 / 1 2: 4 / 1 1: 2 / 4 2: 5 / 2 1: 3 / 5 1: 4 / 5