Конкурентность и асинхронное программирование
Что это такое
Конкурентное выполнение организуют ради того, чтобы программа продвигалась сразу по нескольким делам, а не строго по одному. Асинхронное программирование — один из способов обойтись без отдельного потока для каждого задания: работа запускается, её будущий результат представляют объектом, которого можно дождаться, а управление возвращается циклу, и тот исполняет то, что готово следующим. Оба подхода существуют, чтобы машина не простаивала в ожидании. И оба порождают ошибки одного класса — там, где правила совместного доступа неясны.
Почему это важно
Именно здесь внешне корректная программа отказывает периодически, и именно такой отказ труднее всего воспроизвести. Гонка проявляется под нагрузкой, при определённом числе ядер, при определённом чередовании — и исчезает, стоит подключить отладчик. У асинхронного кода есть и второй режим отказа: выглядит он как обычный код, однако строки вокруг await выполняются не в том порядке, в каком написаны, поэтому состояние может измениться у вас под руками. Знание небольшого набора правил, лежащих в основе обоих подходов, превращает целое семейство невоспроизводимых инцидентов в то, о чём можно рассуждать на бумаге.
Что в этом треке
- Потоки, блокировки и гонки (01-cs-fundamentals/05-concurrency-async-programming/01-threads-locks-and-races) — общее состояние, взаимное исключение, взаимоблокировка и приёмы, которые позволяют обойтись без того и другого.
- Асинхронность, промисы и циклы событий (01-cs-fundamentals/05-concurrency-async-programming/02-async-promises-and-event-loops) — неблокирующий ввод-вывод, ожидание будущего значения и то, что цикл действительно выполняет.
Предварительные требования
Нет.
Что читать дальше
- Операционные системы (01-cs-fundamentals/15-operating-systems) — планировщик и адресное пространство, благодаря которым потоки дёшевы, а гонки возможны.
- Отладка (01-cs-fundamentals/11-debugging) — как воспроизвести сбой, случающийся лишь иногда.
- Компьютерные сети (01-cs-fundamentals/03-computer-networks) — ожидание сети и есть тот случай, ради которого понадобилось асинхронное программирование.