Конкурентность и асинхронное программирование

Что это такое

Конкурентное выполнение организуют ради того, чтобы программа продвигалась сразу по нескольким делам, а не строго по одному. Асинхронное программирование — один из способов обойтись без отдельного потока для каждого задания: работа запускается, её будущий результат представляют объектом, которого можно дождаться, а управление возвращается циклу, и тот исполняет то, что готово следующим. Оба подхода существуют, чтобы машина не простаивала в ожидании. И оба порождают ошибки одного класса — там, где правила совместного доступа неясны.

Почему это важно

Именно здесь внешне корректная программа отказывает периодически, и именно такой отказ труднее всего воспроизвести. Гонка проявляется под нагрузкой, при определённом числе ядер, при определённом чередовании — и исчезает, стоит подключить отладчик. У асинхронного кода есть и второй режим отказа: выглядит он как обычный код, однако строки вокруг await выполняются не в том порядке, в каком написаны, поэтому состояние может измениться у вас под руками. Знание небольшого набора правил, лежащих в основе обоих подходов, превращает целое семейство невоспроизводимых инцидентов в то, о чём можно рассуждать на бумаге.

Что в этом треке

  1. Потоки, блокировки и гонки (01-cs-fundamentals/05-concurrency-async-programming/01-threads-locks-and-races) — общее состояние, взаимное исключение, взаимоблокировка и приёмы, которые позволяют обойтись без того и другого.
  2. Асинхронность, промисы и циклы событий (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) — ожидание сети и есть тот случай, ради которого понадобилось асинхронное программирование.