Статья для тех, кто, как и я, споткнулся об asyncio и так и не понял его до конца.
Моё знакомство с asyncio началось довольно типично и болезненно. На тот момент я уверенно владел базовым синтаксисом Python и решил разобраться с асинхронным кодом, просто открыв документацию верхнеуровневого API (да, я тогда очень буквально воспринял строку из документации о том, что "low-level APIs for library and framework developers" и расшифровал для себя как "даже не смотри в low-level API, это только для больших ребят"). По началу всё выглядело понятно: async, await, задачи, циклы событий. Но при попытке связать это в цельную картину (и начать работать с asyncio-кодом) быстро возникло ощущение, что я понимаю отдельные конструкции, но не понимаю, почему всё это работает так, как работает.
Следующим шагом стала документация низкоуровневого API asyncio. Она добавила ясности: в моём мире появились транспорты, протоколы, соб