Ориентация главы

Том 6 отвечает на вопрос «как заставить несколько потоков исполнения сотрудничать». У него чёткий трёхслойный конвейер: слой примитивов (глава 53: потоки и четвёрка синхронизации — физические правила параллельного мира), слой сотрудничества (главы 54~59: токены отмены, корутины ×2, Channel, Future, исполнители — упаковка физических правил в инженерные инструменты) и структурный слой (глава 60: группы задач и финал отмены — сборка инструментов в параллельные программы с границами жизненного цикла, остановкой и аудируемостью). На открытии — глава с независимой гранулярностью: процессы (глава 52, самый грубый элемент изоляции — песочница для запуска недоверенного кода).

Карта знаний тома

1Открытиепроцессы (51) - грубейшая гранулярность, изолированный запуск внешнего кода
2Слой примитивовпотоки и четвёрка синхронизации (52) - физические правила мьютекса/условия/квоты/rw-блокировки
3Слой сотрудничестватокен отмены (53) -> примитивы корутин (54) -> планировщик (55) -> Channel (56) -> Future (57) -> исполнитель (58)
4Финалгруппы задач (59) - структурный параллелизм, собирающий 53~58 в ограниченные параллельные программы

Одна сквозная линия: отмена

Важнее отдельных инструментов — линия отмены, пронизывающей всю параллельную систему. Глава 54 закладывает фундамент (тройка токена и дерево распространения); корутины главы 55 ощущают отмену в точках уступки (очистный стек гарантирует финал); Close планировщика главы 56 — это «отменить всё»; ожидания канала главы 57 все конфигурируются токеном; в четырёхфинальной развязке Future главы 58 отмена — гражданин первого класса; задачи главы 59 принимают токен и ставят контрольные точки; группы задач главы 60 регламентируют дерево отмены в области видимости. При чтении следите за этой линией: интерфейс отмены каждой главы — диалект токена главы 54 — поняв токен, позы отмены остальных глав осваиваются бесплатно. Инженерный смысл линии — грациозная остановка (глава 49, вторая половина о сигналах): ценность параллелизма не только в «запустилось», но и в «остановилось».

Три ментальные модели

Том 6 стоит унести с тремя переиспользуемыми моделями (они применимы к любой системе параллелизма). «Общая память против сообщений»: внутри структур данных — блокировки/атомики (главы 53/10), между модулями — сообщения (Channel) — внутри компактно, снаружи ясно; два лагеря — не верования, а слои. «Лестница стоимости ожидания»: ждёт поток (стек 1 МБ × параллелизм) → ждёт корутина (десятки КБ × параллелизм) → ждёт Future/обратный вызов (нулевой стек) — инструмент выбирается по объёму ожидания; «много ждём» — ступенькой вниз. «Три гранулярности»: процессы (изолированный запуск недоверенного кода), потоки (истинный параллелизм для вычислений), корутины (высокая конкурентность для ожидания) — трое не заменяют, а дополняют друг друга. Три модели применяются перекрёстно при выборе — карта выбора в финале главы 60 сложит их в одну диаграмму решений. Их ценность шире XRT — оценивая любую параллельную библиотеку или решая, не строить ли свою, начните с вопросов по этим трём моделям.

Связь с соседними томами (этот том — хаб книги)

Связь назад: том 5 заготовил сырьё — первое знакомство с Future (глава 48, асинхронные файлы), зародыш пула задач, остановочный триггер сигналов и конвейер наблюдения (глава 50, чьё продолжение в параллельном контексте цитируется по всему тому). Связь вперёд: сетевой движок тома 7 — крупнейший клиент тома 6 — по корутине на соединение (54/55), цикл событий как насос планировщика, приём-передача через Channel, результаты по Future; HTTP тома 9 и xhttp тома 10 стоят на этом; проекты чата/загрузчика тома 13 — боевой полигон параллельных композиций. Том 6 — хаб книги: возможности первых пяти томов параллелизируются здесь, системы последних четырёх стоят на этом фундаменте.

Три типа читателей — три маршрута

Серверные разработчики (главные): читайте 52→58 по порядку (одна линия от примитивов до исполнителя) — структурный параллелизм финала главы 60 — ваш прямой шаблон «обработки запросов»; глава о процессах (51) — справочная (читается при вызове внешних инструментов). Разработчики встроенных и ограниченных систем: глава примитивов (52) — ваше главное поле боя (память стека корутин и планировщик режутся по железу); Channel/Future — по бюджету соединений; экономика глубины пула главы 60 для вас особенно важна. Пришедшие из Go/Erlang: хорошая новость — семантика Channel (включая трёхстороннее правило закрытия) совпадает с Go, структурный параллелизм напоминает деревья надзора Erlang; подправить нужно «привязку корутины к потоку» (горутины Go мигрируют — у XRT принадлежность фиксирована) и «законность общей памяти» (сообщения — не единственный выбор, употребляйте послойно). Все три типа делят одну линию отмены — это кратчайший путь к пониманию параллелизма XRT.

Напоминание: параллелизм — рычаг и правильности, и сложности

Каждый инструмент тома 6 что-то усиливает — пропускную способность (параллелизм), число соединений (корутины), отзывчивость (асинхронность). Но рычаг усиливает всё: правильные части усиливаются, ошибочные (гонки, deadlock-и, утечки, незавершённая отмена) — тоже, и усиленные ошибки труднее воспроизводятся (зависят от тактов), труднее локализуются (глава 50: конвейер с параллельными поправками), труднее чинятся (починка одного места может сдвинуть такты в другом). Три привычки снижения ущерба: минимальный параллелизм — сперва напишите правильную однопоточную версию, потом параллелизируйте (правильность параллельного меряется по последовательному); явные границы — что разделяется, кто кого ждёт, как растёт дерево отмены — всё в комментарии и документации (неявные договорённости в параллелизме взрываются); наблюдение прежде — прежде инструментов параллелизма подключите наблюдение (конвейер главы 50), чтобы первая гонка уже имела кривые. Рычаг — в подготовленную руку.

Проверка усвоения (самотест перед выходом из тома)

Закройте книгу и ответьте на восемь вопросов: семантика каждого из четвёрки и почему Condition обязан ходить в паре с Mutex? Что решают «однонаправленное распространение» и «контрольные точки» токена отмены? Что гарантируют четыре состояния, три финала и очистный стек корутины? Почему насос и Post планировщика потокобезопасны между потоками? Как трёхстороннее правило закрытия Channel гарантирует остановку без потерь? Четырёхфинальная развязка Future и переправка отказов в продолжениях? Почему протокол остановки исполнителя требует Close прежде Wait? И последнее: для нагрузки «много чтения, мало счёта, ещё больше ожидания» — как вы скомбинируете инструменты тома? Восемь гладких ответов плюс архитектурный эскиз к последнему — том 6 сдан; расплывчатые ответы отправляют в контрактные зоны соответствующих глав.

📖 Справочники API в этой главе:thread (29 записей)coroutine (58 записей)channel (40 записей)future (85 записей)

Полные сигнатуры, ограничения параметров, возвращаемые значения и ошибки