Написать сопрограмму serial(number, barrier), принимающую два параметра — некоторый номер number и объект barrier типа Barrier.
В тестах создаётся один барьер bar определённого размера num и запускается num заданий видаserial(i, bar), где i — некоторое произвольное целое
Каждая сопрограмма должна однократно выводить number.
Задание serial(m, b) выводит m раньше, чем serial(n, b) выводит n, если m < n
- Таким образом в результате номера выводятся в порядке неубывания.
Я просто хранил список номеров в дополнительном поле barrier
Надо вызывать asyncio.sleep(0) для того, чтобы другие сопрограммы тоже поработали
Однако решение «в лоб» (с asyncio.sleep(0)) занимало у меня слишком много времени, и мне пришлось заменить его на ещё одну синхронизацию, которую я тоже сделал с помощью Barrier-ов (см. спойлер)
0 0 2 2 4 4 6 6 8 8
Спойлер. В очередной раз замечу, что async — это не параллелизм, так что проблем с одновременным доступом, например, к списку number-ов, нет. Я решал задачу так (уверен, что может быть и более простое решение):
Все дополнительные поля хранятся в исходном барьере barrier
Этот набор формируется единожды (я просто проверял, что у исходного barrier ещё нет такого поля), после чего активируется событие «набор барьеров создан»
После чего каждое задание serial(num, …):
Ждёт барьера, соответствующего num
Выводит num
Ждёт барьера, соответствующего следующему значению num (если оно есть) — таким образом мы удовлетворяем условию задачи