Aktor — bu nədir, məlumat izolyasiyası və paralellik

Müəllif: IT Sectr Dərc olunub: 2026-06-18 Oxuma vaxtı: 11 dəq

Actor — Swift 5.5+-də təqdim olunan tipdir, hansı ki, məlumat yarışları problemini dil səviyyəsində həll edir.手动 bloklardan və DispatchQueue növbələrindən fərqli olaraq, actor avtomatik olaraq öz vəziyyətini izolyasiya edir və ona girişi sinxronlaşdırır. Bu o deməkdir ki, iki thread eyni anda actor tipinin eyni xassəsini dəyişə bilməz, bu da tərtibatçıdan əlavə səy tələb etmədən yarış vəziyyətini aradan qaldırır. Mexanizm actor izolyasiyası konsepsiyasına əsaslanır, burada kompilyator actor-un xassələrinə və metodlarına girişi izləyir. Apple, 2025-in məlumatlarına görə, actor modeli Swift paralellik sisteminin fundamental hissəsidir.

Əsas məqamlar

  • Actor — kompilyator səviyyəsində öz vəziyyətini məlumat yarışlarından avtomatik izolyasiya edən tip
  • Izolyasiya yalnız bir thread-in eyni anda actor nüsxəsinə girişini təmin edir
  • Çağırışlar actor metodları async/await mexanizmi vasitəsilə asinxron şəkildə yerinə yetirilir
  • Nonisolated actor-un ayrı-üzvləri üçün izolyasiyanı seçmə şəkildə söndürməyə imkan verir
  • Reentrancy qarşılıqlı bloklamaların qarşısını alaraq actor-a təkrar daxil olmağa icazə verir

Swift-də Actor nədir?

Actor — sinifə bənzər, lakin məlumat yarışlarından avtomatik qorunma ilə istinad tipidir. Swift 5.5-də async/await və Task ilə birlikdə paralellik sisteminin bir hissəsi kimi təqdim edilmişdir. Actor öz dəyişən vəziyyətinin açıq sinxronizasiya olmadan müxtəlif thread-lərdən eyni anda oxunmayacağını və ya yazılmayacağını təmin edir.

Actor bəyannaməsinin sintaksisi

Actor elan etmək üçün actor açar sözü istifadə olunur, ondan sonra onun üzvləri ilə fiqurlu mötərizələr gəlir. Sintaktik olaraq actor sinifə bənzəyir, lakin davranışı köklü şəkildə fərqlənir.

swift
actor BankAccount {
    private var balance: Double
    
    init(initialBalance: Double) {
        self.balance = initialBalance
    }
    
    func deposit(amount: Double) {
        balance += amount
    }
    
    func getBalance() -> Double {
        return balance
    }
}

Kompilyator actor-un bütün xassələrini və metodlarını avtomatik olaraq izolyasiya edir ki, onlar yalnız aktor konteksti daxilində əlçatan olsun. Actor xaricindən balance-a daxil olmaq cəhdi, əgər çağırış async kimi qeyd edilməyibsə, kompilyator xətasına səbəb olacaq.

Actor-də məlumat izolyasiyası necə işləyir

Məlumat izolyasiyası — actor-un əsas konsepsiyasıdır. Actor, actor icraçısı (actor executor) mexanizmi vasitəsilə öz vəziyyətinə qarşılıqlı münasibətdə çıxarılan girişi təmin edir. Hər bir actor-un öz icraçısı var, hansı ki, onun izolyasiya edilmiş üzvlərinə bütün müraciətləri ardıcıl şəkildə emal edir.

Izolyasiyanın işləmə prinsipi

Actor xaricindəki kod onun metodunu çağırdıqda, çağırış actor icraçısının növbəsinə yerləşdirilir. Actor eyni anda yalnız bir tapşırığı yerinə yetirir, bu da yarışların olmamasını təmin edir. Əgər iki thread eyni anda deposit-i çağırırsa, ikinci çağırış birincinin bitməsini gözləyir.

swift
let account = BankAccount(initialBalance: 1000.0)
// Asinxron çağırış — actor xaricindən tələb olunur
await account.deposit(amount: 500.0)
let currentBalance = await account.getBalance()

Actor metodunun hər çağırışı await tələb edir, çünki actor başqa bir tapşırıqla məşğul ola bilər. Bu səhv deyil, yarışların qarşısını alan şürurlu dizayndır. Swift actor-un xassələrinin getter və setter-lərini gizli şəkildə async edir, buna görə xassənin oxunması da await tələb edir.

Actor və sinif arasındakı əsas fərqlər

Actor və sinif istinad tipləridir, lakin onların çoxthreadli mühitdə davranışı köklü şəkildə fərqlənir. Sinif yarışlara qarşı heç bir avtomatik qoruma təmin etmir, halbuki actor bunu tip sistemi vasitəsilə kompilyator səviyyəsində qurur.

XarakteristikaActorClass
Yarışlardan qorunmaAvtomatik, kompilyator səviyyəsindəƏl ilə sinxronizasiya tələb edir
Xassələrə girişYalnız xaricdən await vasitəsiləBirbaşa, sinxronizasiyasız
MirasYalnız digər actor-lardanStandart sinif mirası
Protokollara uyğunluqProtokollara uyğun ola bilərStandart
PerformansIzolyasiyada aşağı yükSinxronizasiyasız — daha sürətli

Actor mirası

Actor yalnız başqa bir actor-dan miras ala bilər və sinifdən miras ala bilməz. Bu şürurlu şəkildə edilmişdir, çünki sinifdə actor izolyasiyası mexanizmi yoxdur və iki modelin qarışdırılması qeyri-müəyyən davranışa səbəb olardı.

swift
actor SavingsAccount: BankAccount {
    func applyInterest(rate: Double) {
        let interest = balance * rate
        balance += interest
    }
}

Actor metodlarının asinxron çağırışları

Asinxron çağırışlar — koddan actor ilə qarşılıqlı əlaqə mexanizmidir. Actor öz vəziyyətini izolyasiya etdiyi üçün, onun üzvlərinə xaricdən hər giriş await tələb edir. Bu, Swift-ə çağıran kodun thread-i bloklamadığına və actor-un digər sorğuları emal edə biləcəyinə zəmanət verməyə imkan verir.

Qlobal və lokal aktorlar

Elan edilmiş actor tiplərindən əlavə, Swift qlobal aktorları dəstəkləyir — @MainActor atributu, hansı ki, sinifləri, xassələri və ya metodları əsas thread-də yerinə yetiriləcək kimi qeyd edir. Bu, xüsusilə UIKit və SwiftUI ilə işlərkə faydalıdır.

swift
@MainActor
class ViewModel: ObservableObject {
    @Published var title: String = ""
    
    func updateTitle() {
        // Bu kodun əsas thread-də yerinə yetiriləcəyinə zəmanət verilir
        title = "New Title"
    }
}

@MainActor istifadəsi DispatchQueue.main.async-əl ilə çağırma ehtiyacını aradan qaldırır, bu da kodu daha təmiz və təhlükəsiz edir. Kompilyator əsas thread-ə keçidin düzgün baş verdiyini yoxlayır.

Nonisolated və actor-isolated kontekstlər

Nonisolated — actor-un metodunu və ya hesablanmış xassəsini izolyasiya olunmayan kimi qeyd etməyə imkan verən açar sözdür. Belə üzvlər actor-un izolyasiya edilmiş vəziyyətinə girişə malik deyillər, lakin actor xaricindən await olmadan çağırıla bilərlər.

Nonisolated funksiyalar

Nonisolated metodlar actor-un dəyişən vəziyyətindən asılı olmayan hesablamalar üçün faydalıdır. Məsələn, formatBalance metodu birbaşa balance-a müraciət etmir, ancaq ötürülən dəyəri formatlaşdırır — belə bir metodu təhlükəsiz şəkildə nonisolated etmək olar.

swift
actor BankAccount {
    private var balance: Double = 0
    
    nonisolated func formatBalance(amount: Double) -> String {
        return "$\(amount)"
    }
}

Nonisolated üzvlər sinxron şəkildə yerinə yetirilir və await tələb etmir. Lakin onlar birbaşa actor-un izolyasiya edilmiş xassələrini oxuya bilməzlər. Əgər nonisoled metodun actor-dan dəyərə ehtiyacı varsa, onu parametr kimi ötürmək lazımdır.

Reentrancy və təkrar daxil olma

Reentrancy — asinxron çağırışın gözlənməsi zamanı actor-a təkrar daxil olmağa imkan verən mexanizmdir. Reentrancy olmadan, actor-un bir metodu digərini gözləyərsə, o da birincini gözləyərsə, actor əbədi olaraq bloklana bilər.

Reentrancy necə işləyir

Actor daxilindəki kod await yerinə yetirdikdə, actor cari tapşırığı dayandırır və növbəyə qoyulmuş digərini emal edə bilər. await tamamlandıqdan sonra tapşırıq bərpa olunur. Bu, deadlock-ların qarşısını alır, lakin ehtiyatlı olmağı tələb edir: await nöqtələri arasında actor-un vəziyyəti dəyişə bilər.

swift
actor DataProcessor {
    var cache: [Int: String] = [:]
    
    func process(id: Int) async -> String {
        if let cached = cache[id] {
            return cached
        }
        // await — təkrar daxil olma nöqtəsi
        let result = await fetchData(id: id)
        // await-dən sonra keş dəyişmiş ola bilər — yenidən yoxlayın
        cache[id] = result
        return result
    }
}

Tərtibatçılar reentrancy-ni nəzərə almalı və await nöqtələrindən sonra actor-un vəziyyətini yoxlamalıdır. Tipik səhv, actor izolyasiyasının asinxron fasilələr boyunca saxlanıldığını güman etməkdir. Praktikada await ilə növbəti operator arasında vəziyyət gözləniləndən fərqlənə bilər.

Tez-tez verilən suallar

Actor Swift-də sinifdən nə ilə fərqlənir?

Actor öz vəziyyətini məlumat yarışlarından avtomatik izolyasiya edir, xaricdən giriş üçün await tələb edir. Sinif belə qoruma təmin etmir — tərtibatçı bloklar və ya növbələr vasitəsilə sinxronizasiyaya özü cavabdehdir. Actor yalnız actor-dan miras alır, sinif — sinifdən.

Actor-dan miras almaq olarmı?

Bəli, actor başqa bir actor-dan miras ala bilər. Alt sinif valideynin bütün izolyasiya edilmiş xassələrini və metodlarını alır. Actor sinifdən miras ala bilməz, çünki siniflərin kompilyator səviyyəsində actor izolyasiyası mexanizmi yoxdur.

Actor-isolated kontekst nədir?

Actor-isolated kontekst — actor-un dəyişən vəziyyətinə birbaşa girişə icazə verilən kod sahəsidir. Isolated (defolt olaraq) kimi qeyd edilmiş actor metodları daxilində await olmadan xassələri oxumaq və yazmaq olar. Kompilyator izolyasiya sərhədlərini yoxlayır.

Actor-dan xarici koda məlumatları necə ötürmək olar?

Actor-dan məlumatlar async-metodlar vasitəsilə ötürülür, hansı ki, Sendable tiplərini qaytarır, və ya dəyərləri parametr kimi qəbul edən nonisolated metodlar vasitəsilə. Həmçinin, actor-un vəziyyətinin Sendable struktur şəklində anlıq görüntüsünü qaytaran async xassə yaratmaq olar.

Actor protokol mirasını dəstəkləyirmi?

Bəli, actor protokollara uyğun ola bilər. Əgər protokol izolyasiya edilmiş tələblər (actor-isolated) ehtiva edirsə, onlar avtomatik olaraq actor-izolyasiya edilmiş olur. Protokollardakı asinxron metodlar üçün isolated markeri ilə konkret actor-da çağırılmalı olduğunu göstərmək olar.

Nəticə

  • Actor — Swift 5.5+-də təqdim olunan avtomatik məlumat izolyasiyası ilə istinad tipi
  • Izolyasiya sorğuları ardıcıl emal edən actor icraçısı vasitəsilə işləyir
  • Xarici giriş actor-a await tələb edir — bu, yarışların olmamasını təmin edir
  • Nonisolated izolyasiya edilmiş vəziyyətə girişi olmayan sinxron metodlar elan etməyə imkan verir
  • Qlobal aktorlar (@MainActor) izolyasiyanı bütün icra thread-inə yayır
  • Reentrancy await zamanı actor-a təkrar daxil olmağa icazə verərək deadlock-ların qarşısını alır

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun