Подробнее:
Есть n asyncio.Event, на каждом из них висит ровно одна корутина (await asyncio.Event.wait()).
Метод asyncio.Event.set() - не корутина, и его вызов сразу же не отдает управление разбуженной корутине.
Вопрос: если я в цикле вызову на всех ивентах set(), то разбуженные корутины гарантированно начнут работу в том же порядке, в каком я вызвал set() на соответсвтующем ивенте?
Вот пример:
import asyncio
async def coro(n, event):
await event.wait()
print(n)
async def main():
events = []
for i in range(10):
event = asyncio.Event()
events.append(event)
asyncio.create_task(coro(i, event))
await asyncio.sleep(2)
for ev in events[5:] + events[:5]: # (1)
ev.set()
print('all events are set')
await asyncio.sleep(2) # да, я знаю, что не так нужно дожидаться завершения корутин
if __name__ == '__main__':
asyncio.run(main())
В строке (1) намеренно изменен порядок вызовов set() и в итоге я получаю в stdout такой порядок чисел: (5,6,7,8,9,0,1,2,3,4), который полностью соответствует порядку вызовов set().
Хотя я запускал этот код не один раз и получал один и тот же результат, все же хочется быть уверенным на 100%, т.е. иметь пруфы, т.к. в моем проекте это важно. Может кто знает где это поведение описывается?