UncategorizedгаджетыНовостиразработчиктехнология

Swift 5.5 обеспечивает поддержку Async / Await и актеров

На WWDC21 Apple представила Swift 5.5, доступный в бета-версии. Среди его новых функций одна из самых ожидаемых – улучшенная поддержка параллелизма с использованием aysnc/await и актеры.

По словам Apple, асинхронные функции призваны упростить написание и понимание параллельного кода Swift. Традиционно Swift использовал закрытие и обработчики завершения для обработки асинхронных операций. Как известно, такой подход быстро приводит к «аду обратных вызовов», когда в вашем коде много асинхронных операций или поток управления усложняется.

Вместо этого асинхронные функции Swift привносят в язык сопрограммы.

Функции могут быть асинхронными, что позволяет программисту составлять сложную логику, включающую асинхронные операции, с использованием обычных механизмов потока управления. Компилятор отвечает за преобразование асинхронной функции в соответствующий набор замыканий и конечных автоматов.

В следующем фрагменте кода показано, как можно объявить и вызвать async функции, как если бы они были синхронными:

func loadWebResource(_ path: String) async throws -> Resource
func decodeImage(_ r1: Resource, _ r2: Resource) async throws -> Image
func dewarpAndCleanupImage(_ i : Image) async throws -> Image

func processImageData() async throws -> Image {
  let dataResource  = try await loadWebResource("dataprofile.txt")
  let imageResource = try await loadWebResource("imagedata.dat")
  let imageTmp      = try await decodeImage(dataResource, imageResource)
  let imageResult   = try await dewarpAndCleanupImage(imageTmp)
  return imageResult
}

Хотя асинхронные функции значительно упрощают управление параллелизмом, они не исключают возможность возникновения взаимоблокировок или повреждения состояния. В частности, программисты должны знать о точки подвеса что вводят асинхронные функции. В точке приостановки функция отказывается от своей нити. Это происходит, например, когда вы вызываете асинхронную функцию, связанную с другим контекстом выполнения. Чтобы избежать риска взаимоблокировок или повреждения данных, асинхронным функциям следует избегать вызова функций, которые могут блокировать их поток.

Например, получение мьютекса может блокироваться только до тех пор, пока какой-либо из выполняемых в данный момент потоков не откажется от мьютекса; Иногда это приемлемо, но следует использовать осторожно, чтобы избежать возникновения тупиковых ситуаций или проблем искусственного масштабирования. Напротив, ожидание переменной условия может блокироваться до тех пор, пока не будет запланирована другая произвольная работа, которая сигнализирует об этой переменной; этот шаблон категорически противоречит рекомендациям.

Интересная эволюция этой функции позволяет вызывать асинхронные API-интерфейсы Objective-C, которые используют обработчики завершения, используя await выражение.

С другой стороны, актеры – это абстракция, построенная на async а также await для безопасного доступа к изменяемому состоянию. Короче говоря, акторы инкапсулируют некоторое состояние и предоставляют набор методов для безопасного доступа к нему.

В отличие от классов, акторы позволяют только одной задаче получать доступ к своему изменяемому состоянию за раз, что делает безопасным взаимодействие кода в нескольких задачах с одним и тем же экземпляром актора.

Это пример актера Swift:

actor TemperatureLogger {
    let label: String
    var measurements: [Int]
    private(set) var max: Int

    init(label: String, measurement: Int) {
        self.label = label
        self.measurements = [measurement]
        self.max = measurement
    }
}

Методы актора могут использоваться как синхронно, так и асинхронно изнутри актора, но компилятор заставит вас использовать асинхронную операцию для чтения состояния актора извне.

Если вам интересно узнать, как параллелизм Swift работает за кулисами, понять, чем задачи Swift отличаются от Grand Central Dispatch и как писать параллельный код Swift с учетом производительности, не пропустите сеанс Apple WWDC. Swift concurrency: за кулисами.

Swift 5.5 в настоящее время доступен как часть бета-версии Xcode 13, которую можно загрузить с веб-сайта разработчика Apple.

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button