2021-03-03 13:49:13
Дайджест concurrencyРасскажем о текущем состоянии всех компонентов асинхронности и конкурентности, над которыми крайне упорно работают команда Свифта и комьюнити в последние месяцы.
Сперва пройдемся по тому, что уже есть, и меняться не будет (либо незначительно):
1. Предложение №296 (https://trtq.ru/b/rg), с которого всё началось, и которое описывает языковые конструкции
async/await, полностью утверждено и появится в продакшене в следующей версии языка. Правда, не уточняется, в какой: минорной (5.4) или мажорной (6.0).
2. Предложение №297 (https://trtq.ru/b/rh) про поддержку async/await в коде
Objective-C принят. Известно, что все компоненты Foundation с completion handlers будут портированы на async/await, но в обход процедуры пропозалов, поскольку эта часть не регламентируется процессом пропозалов напрямую.
3. Предложение №298 (https://trtq.ru/b/rj) про
AsyncSequence принят.
Теперь о пропозалах, находящихся в стадии активного обсуждения:
1. Предложение №300 (https://trtq.ru/b/rk) про создание асинхронных функций из синхронных (у которых есть completion handler) находится в третьей итерации активного обсуждения, которая закончится девятого марта. Живой пример использования этого инструмента можно подсмотреть по ссылке (https://trtq.ru/b/rm).
2. Предложение №302 (https://trtq.ru/b/rn) про конкурентно-безопасные типы (протокол Sendable, ранее назывался ConcurrentValue) находится в четвертой итерации активного обсуждения, которая закончится восьмого марта.
3. Предложение №304 (https://trtq.ru/b/rp) про структурированную конкурентность (structured concurrency) (пересказывать содержание долго, проще почитать по ссылке) начнет первую итерацию активного обсуждения четвертого марта и продлится она до шестнадцатого марта.
NB: всё вышеперечисленное уже доступно (на разной стадии готовности) в main ветке репозитория языка. Можно либо сделать сборку самому, либо скачать официальный снепшот по ссылке https://swift.org/download/#snapshots.И наконец, пропозалы, находящиеся на стадии питча, то есть предварительного обсуждения и формирования официального пропозала:
1. Гвоздь сезона: акторы! Пошла четвертая итерация питча пропозала этого функционала. Ознакомиться с проектом пропозала можно тут по ссылке (https://trtq.ru/b/rq), а само обсуждение происходит на форуме по ссылке (https://trtq.ru/b/rs). Ранняя реализация акторов присутствует в мейн-ветке, можно пощупать.
2. async let — некая форма фьючеров (или промисов из JS), т. е. значение будет присвоено однажды, и когда оно потребуется, нужно будет указать перед свойством await. Звучит сложнее, чем на самом деле. Пропозал отпочковался от оригинально очень большого пропозала structured concurrency (см. выше). Проект пропозала с примерами по ссылке (https://trtq.ru/b/rr).
3. Custom executors (https://trtq.ru/b/rt). Все асинхронные функции делятся на синхронные куски функций (partial tasks). Их необходимо как-то организованно выполнять. По умолчанию операционная система будет предоставлять два дефолтных экзекьютора (программистам даже не нужно переживать по этому поводу, всё автоматично и прозрачно) — для последовательного и параллельного выполнения задач, плюс при каждом акторе будет создаваться индивидуальный экзекьютор для сериализации его работы (подробнее читайте в питче пропозала акторов). В макоси, например, экзекьюторы будут построены на GCD, а в линуксе и винде — на
местных технологиях (например, pthread и processthreadsapi). Но в некоторых случаях есть необходимость подменить стандартные экзекьюторы кастомными. Например, это актуально для серверных приложений на SwiftNIO, ведь EventLoop это ни что иное, как экзекьютор. Именно с этой целью и создается этот пропозал, формализующий несколько протоколов и структур, позволяющих создавать те самые кастомные экзекьюторы для всего рантайма и отдельных акторов. Питч находится на довольно ранней стадии.
301 viewsKirill Titov, edited 10:49