Найти в Дзене
Chidorin

Глоссарий по параллелизму в Swift

Было бы неплохо иметь одно место, куда можно обратиться за всеми терминами, ключевыми словами и аннотациями, связанными с параллелизмом в Swift. Вот оно. Вам совсем необязательно понимать всё здесь, чтобы успешно использовать параллельность. Сообщите мне, если я что-то пропустил! И конечно же, я добавил несколько комментариев. Тип: Ключевое слово
Использование: Определяет новый ссылочный тип, который защищает изменяемое состояние
Введено: SE-0306 Актеры
Актеры определяют единицу изоляции. Их легко создать, но для успешного использования требуется хорошее понимание и практика. Тип: Протокол
Использование: Протокол, которому соответствуют все типы актеров
Введено: SE-0306 Актеры
Это похоже на AnyObject, но только для типов актеров. Вы редко будете нуждаться в этом, кроме случаев создания изолированных параметров. Тип: ключевое слово
Использование: Применяется к сигнатуре функции, чтобы она могла использоваться с await
Введено: SE-0296 Async/await
Это ключевое слово отмечает «эффект» функ
Оглавление

Было бы неплохо иметь одно место, куда можно обратиться за всеми терминами, ключевыми словами и аннотациями, связанными с параллелизмом в Swift. Вот оно. Вам совсем необязательно понимать всё здесь, чтобы успешно использовать параллельность. Сообщите мне, если я что-то пропустил!

И конечно же, я добавил несколько комментариев.

actor

Тип: Ключевое слово
Использование: Определяет новый ссылочный тип, который защищает изменяемое состояние
Введено: SE-0306 Актеры
Актеры определяют единицу изоляции. Их легко создать, но для успешного использования требуется хорошее понимание и практика.

Actor

Тип: Протокол
Использование: Протокол, которому соответствуют все типы актеров
Введено: SE-0306 Актеры
Это похоже на AnyObject, но только для типов актеров. Вы редко будете нуждаться в этом, кроме случаев создания изолированных параметров.

async

Тип: ключевое слово
Использование: Применяется к сигнатуре функции, чтобы она могла использоваться с await
Введено: SE-0296 Async/await
Это ключевое слово отмечает «эффект» функции, позволяя ей использовать await внутри себя и также ожидать её выполнения.

AsyncSequence

Тип: Протокол
Использование: Последовательность значений, которые производятся со временем
Введено: SE-0298 Async/Await: Последовательности
Этот протокол описывает последовательность, значения которой могут быть доступны лишь через некоторое время.

async let

Тип: Управление потоком
Использование: Удобный способ обернуть работу в новую задачу
Введено: SE-03017 Связывание async let
Эта возможность позволяет начать выполнение работы асинхронно без необходимости немедленного ожидания. Много полезных применений, но есть некоторые нюансы.

await

Тип: ключевое слово
Использование: Обозначает точку приостановки, которая позволяет асинхронной функции выполняться
Введено: SE-0296 Async/await
Другая половина async. Используется для введения потенциальной точки приостановки в текущей выполняемой задаче. В этих точках актер, исполняющий код, может меняться.

Continuations

Тип: Тип
Использование: Позволяет оборачивать код на основе обратных вызовов так, чтобы он мог использоваться с await
Введено: SE-0300 Продолжения для взаимодействия асинхронных задач с синхронным кодом
Асинхронное выполнение не ново. Но часто оно выражалось через обратные вызовы и замыкания. Это целый набор API, позволяющий выразить эти концепции в виде асинхронных функций.

Executor

Тип: Протокол
Использование: API для выражения того, как актеры выполняют код
Введено: SE-0304 Структурная параллельность
Существует довольно большой набор API для управления и взаимодействия с механизмами, которыми актер использует для запуска кода. Обычно это не требуется для повседневной разработки на Swift, но полезно для продвинутых сценариев и оптимизации производительности.

for-await

Тип: Управление потоком
Использование: Получение значений из AsyncSequence
Введено: SE-0298 Async/Await: Последовательности
Позволяет получать значения из AsyncSequence с помощью конструкции управления, очень похожей на традиционный цикл for.

@globalActor

Тип: Аннотация
Использование: Помечает тип актера как глобальный, позволяя ему использоваться в качестве глобальной аннотации актера
Введено: SE-0316 Глобальные актеры
Так вы делаете тип актера «глобальным». Имя типа глобального актера может быть использовано в форме аннотаций и применяться для статической изоляции.

Global Executor

Тип: концепция
Использование: Исполнитель, который запускает неизолированный код
Введено: SE-0338 Уточнение выполнения неизолированных асинхронных функций
Где выполняется код, если актеры запускают свой код в изоляции? Он выполняется на «Глобальном исполнителе». В отличие от исполнителей актеров, этот исполнитель не является последовательным и может выполнять несколько операций одновременно.

isolated

Тип: ключевое слово
Использование: Определяет статическую изоляцию через параметр функции
Введено: SE-0313 Улучшенный контроль над изоляцией актера
Есть три способа определить статическую изоляцию, и это самый мощный и сложный из них. Этот инструмент необходим, если вам нужно интегрировать параллельность в несендабельные типы.

(Сейчас ведется работа по упрощению этой области! Я также написал о том, как использовать её с несендабельными типами.)

@isolated(any)

Тип: Аннотация
Использование: Позволяет проверять статическую изоляцию функции во время выполнения
Введено: SE-0431 @isolated(any) Типы функций
Иногда бывает необходимо проверить статическую изоляцию функции, переданной в переменной. Эта аннотация делает это возможным. Если вы задумываетесь об этом, вероятно, захотите объединить её с @_inheritActorContext.

(Я писал конкретно об этом.)

isolation

Тип: Концепция
Использование: Форма безопасности потоков, которую обеспечивает тип актера
Введено: SE-0306 Актеры
Изоляция – это абстракция способов обеспечения безопасности потоков. Актеры реализуют эту безопасность, возможно, через последовательную очередь.

(У меня есть две статьи на эту тему. Одна о том, как использовать изоляцию, а другая помогает думать об этом.)

#isolation

Тип: Макрос выражения
Использование: Возвращает статическую изоляцию как (any Actor)?
Введено: SE-0420 Наследование изоляции актера
Если вы используете изолированный параметр, возможно, захотите использовать и это. Также я нашел полезным вывод информации о том, какую изоляцию компилятор считает правильной в конкретной точке.

(Я тоже писал об этом.)

@_inheritActorContext

Тип: Аннотация параметра
Использование: Применяет наследование изоляции к параметру замыкания
Введено: ?
Вы можете использовать это для соответствия семантике задачи, чтобы замыкание могло сохранять ту же изоляцию, что и при создании. Обычно используется вместе с @isolated(any).

(Есть предложение, которое формализует это, хотя у меня сложные чувства по этому поводу.)

@MainActor

Тип: Аннотация
Использование: Глобальная аннотация актера для типа MainActor
Введено: SE-0316 Глобальные актеры
Полагаю, вы уже сталкивались с этим. Это просто способ ссылки на общий экземпляр MainActor.

nonisolated

Тип: ключевое слово
Использование: Явная отмена изоляции актера для объявления
Введено: SE-0313 Улучшенный контроль над изоляцией актера
Актеры обеспечивают изоляцию, но иногда вы хотите отключить её. Это удобный способ выйти из актера для выполнения кода в фоновом режиме.

@preconcurrency

Тип: Атрибут
Использование: Несколько вариантов, связанных с взаимодействием кода, написанного для Swift 6, с кодом, который еще не поддерживает параллельность
Введено: SE-0337 Постепенная миграция на проверку параллельности, SE-0423: Динамическое применение изоляции актера из контекста, не поддерживающего строгую параллельность
Если вы потребляете API, созданные до Swift 6, или создаете API, которые должны оставаться совместимыми с режимом Swift 5, то вам почти наверняка понадобится этот атрибут.

(Я подробно описал, как это работает.)

Region-Based Isolation

Тип: Концепция
Использование: Позволяет компилятору ослабить проверку Sendable в определенных обстоятельствах
Введено: SE-0414 Изоляция на основе региона
Это система анализа потока кода, позволяющая компилятору доказать, что даже если тип не является Sendable, конкретный шаблон использования может быть безопасным. Она может работать только в пределах одного тела функции, но ключевое слово sending делает её ещё мощнее.

(Моя краткая сводка доступна здесь.)

Sendable

Тип: Протокол
Использование: Протокол-маркер, указывающий, что тип может безопасно использоваться из любой изоляции, включая отсутствие таковой вообще
Введено: SE-0302 Sendable и @Sendable замыкания
Обеспечивает способ закодирования безопасности потоков типа в систему типов. И у него нет членов, так насколько сложным он может быть?

(Я даже не писал прямо об этом, но затронул общую идею здесь.)

@Sendable

Тип: Атрибут
Использование: Функции не могут соответствовать протоколам, поэтому нужен атрибут для выражения той же идеи
Введено: SE-0302 Sendable и @Sendable замыкания
Это точно такая же вещь, как Sendable, но для типов функций.

sending

Тип: Ключевое слово
Использование: Кодирует использование параметров и возвращаемых значений в системе типов
Введено: SE-0430 Параметры и результаты с использованием отправки
Иногда Sendable/@Sendable слишком сложно или излишне ограничительно. Ключевое слово sending – это способ ослабления некоторых ограничений путем кодирования строгого обещания относительно поведения значений в ваши сигнатуры функций.

(Да, я действительно писал об этом!)

Task

Тип: Тип
Использование: Создает новый контекст верхнего уровня для выполнения асинхронного кода
Введено: SE-0304 Структурная параллельность
Нужно начинать где-то, и для асинхронных функций обычно это делается через Task. Однако этот тип поставляется с множеством возможностей, таких как поддержка отмены и доступа к результатам.

TaskGroup

Тип: Тип
Использование: API для работы с произвольным количеством дочерних задач
Введено: SE-0304 Структурная параллельность
TaskGroup предоставляет возможность управлять и контролировать множество экземпляров задач. Полезен для решения различных проблем, включая одновременное выполнение множества действий.

TaskLocal

Тип: Тип
Использование: Механизм для предоставления значений в рамках текущей задачи
Введено: SE-0311 Локальные значения задачи
Это аналог локальных значений потоков, но для задач. Они являются достаточно продвинутым инструментом, но с их помощью можно реализовать много умных и хитрых вещей.

@unchecked

Тип: Аннотация
Использование: Отключает проверки компилятора для соответствия Sendable
Введено: SE-0302 Sendable и @Sendable замыкания
Иногда у вас уже реализована безопасность потоков, но она выполнена с использованием механизма, который не поддерживается проверками компилятора Swift. Объявление типа как @unchecked Sendable позволяет выразить такую ситуацию.

Источник