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 — 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 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.
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.
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.
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.
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 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.
| Xarakteristika | Actor | Class |
|---|---|---|
| Yarışlardan qorunma | Avtomatik, 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 |
| Miras | Yalnız digər actor-lardan | Standart sinif mirası |
| Protokollara uyğunluq | Protokollara uyğun ola bilər | Standart |
| Performans | Izolyasiyada aşağı yük | Sinxronizasiyasız — daha sürətli |
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ı.
actor SavingsAccount: BankAccount {
func applyInterest(rate: Double) {
let interest = balance * rate
balance += interest
}
}
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.
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.
@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 — 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 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.
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 — 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.
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.
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 ö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.
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 — 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 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.
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ə
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.
Həm də oxuyun