Перейти к содержанию

3. Actor Hopping


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


Actor hopping — это концепция в модели экторов в Swift, которая описывает процесс переключения между разными акторами в асинхронном коде. Когда вы вызываете метод на одном акторе из контекста другого актора, происходит "прыжок" от одного актора к другому. Это требует изменения контекста выполнения, чтобы обеспечить потокобезопасный доступ к состоянию каждого актора.

Основные моменты

  1. Контекст выполнения: Каждый актор имеет свой контекст выполнения, и "прыжок" между ними требует переключения этого контекста. Это может привести к дополнительным затратам на производительность.

  2. Асинхронность: Поскольку акторы защищают свое состояние, вызовы методов на акторах должны быть асинхронными, что подразумевает использование await.

  3. Избежание блокировок: "Actor hopping" помогает избежать блокировок и гонок данных, так как каждый актор управляет доступом к своему состоянию.

  4. Производительность: Хотя акторы упрощают управление состоянием и потокобезопасностью, чрезмерное "прыгание" между акторами может привести к потере производительности из-за дополнительных переключений контекста.

Пример

Предположим, у вас есть два актора, и вы хотите, чтобы один из них обновлял данные другого:

actor ActorA {
    private var data: Int = 0

    func updateData(with value: Int) {
        data = value
    }
}

actor ActorB {
    private var value: Int = 0

    func performUpdate(on actorA: ActorA) async {
        await actorA.updateData(with: value)
    }
}

В этом примере ActorB вызывает метод updateData на ActorA. Это пример actor hopping, где выполнение переключается от ActorB к ActorA для выполнения обновления данных.