Как на самом деле работает .await: пишем свой async-рантайм на Rust с нуля
vibecodingai 29 минут назад Как на самом деле работает .await: пишем свой async-рантайм на Rust с нуля Средний 17 мин 1K Rust * Системное программирование * Параллельное программирование * Туториал Если попросить...
Anthropic — What company has the best second artificial intelligence model at the end of June?
Вот важная новость с фронта ИИ: vibecodingai 29 минут назад Как на самом деле работает . await: пишем свой async-рантайм на Rust с нуля Средний 17 мин 1K Rust * Системное программирование * Параллельное программирование * Туториал Если попросить среднего Rust-разработчика объяснить, что делает . await, в ответ обычно звучит что-то про «приостанавливает выполнение, пока не придут данные».
Это верно ровно настолько же, насколько «компьютер думает» объясняет работу процессора. await не стоит ни потока, ни приостановки в привычном смысле. Стоит обычный enum и вызов функции по указателю.
Технические детали
Я полгода писал async-код на tokio, искренне считая рантайм чернм ящиком, в который лучше не лезть. Сломался этот настрой в тот день, когда у меня в проде намертво зависла одна задача: по логам она обязана была проснуться, но не просыпалась. Я потерял на ней вечер, а причина оказалась в одной строчке про Waker, к которой мы ещё вернёмся.
Тогда я плюнул и за пару вечеров написал свой рантайм с нуля - и оказалось, что весь фундамент умещается в голове за один присест и примерно в 200 строк кода. После этого и тот баг стал очевидным, и исходники tokio начали читаться как книга, а не как заклинание. В этой статье мы соберём работающий async-рантайм на голой std, без единой сторонней зависимости.
Будет два полных компилируемых примера: исполнитель, который крутит сто тысяч задач в одном потоке, и async-эхо-сервер на epoll, держащий сотни соединений тем же одним потоком. По дороге станет понятно, откуда в сигнатурах берутся Pin, Send и 'static, почему Waker сделан так странно, и чем именно tokio отличается от нашей игрушки. async fn компилируется в машину состояний (enum).
Отраслевые последствия
Рантайм это три кубика: Future умеет делать шаг и говорить «готово» или «не сейчас»; исполнитель держит очередь готовых задач и опрашивает их; реактор спит на epoll_wait и будит задачи, когда ОС сообщает о готовности сокета. Связывает всё Waker - колбэк «верни мою задачу в очередь». Никакого опроса в цикле, никакого busy-wait: спящая задача стоит почти ноль.
Статья рассчитана на тех, кто уже пишет на Rust и пользуется async/. await, но хочет понять, что под капотом. Глубокого знания tokio не требуется, наоборот, к концу он перестанет быть чёрным ящиком.
Зачем вообще нужен рантаймКлассическая модель «поток на соединение» упирается в стоимость потока. Стек по умолчанию это 8 МБ виртуальной памяти на поток в Linux; даже если резидентно занято мало, на 100 тысячах потоков вы упираетесь в лимиты, а планировщик ядра захлёбывается на переключениях контекста. Async переносит многозадачность в пространство пользователя: несколько рабочих потоков кооперативно жонглируют десятками и сотнями тысяч задач, и переключение между задачами это не syscall, а обычный возврат из функции.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





