Sobes.tech
Middle

Vai šajā gadījumā ir nepieciešams izmantot asīnhrono izpildītāju?

sobes.tech AI

Atbilde no AI

Jā, tas ir nepieciešams.

Kad piekļūtu actor no ārēja izolēta konteksta (šajā gadījumā no globālā konteksta), kompilators garantē pavedienu drošību, pieprasot asinhronu piekļuvi.

// Demonstrācijas protokols
protocol DataFetcher {
    func fetchData() async -> String
}

actor DataCache {
    var cache: [String: String] = [:]

    func updateCache(key: String, value: String) {
        cache[key] = value // Darbojas `actor` izolētā kontekstā
    }

    func cachedData(forKey key: String) -> String? {
        return cache[key] // Darbojas `actor` izolētā kontekstā
    }

    nonisolated func clearCacheIsolated() {
        // Šī funkcija ir atzīmēta kā nonisolated un tai nav piekļuves `actor` stāvoklim
        // Piekļuvei ir nepieciešama asinhrona izsaukšana
    }
}


class DataLoader {
    let cache: DataCache // Atsauce uz `actor`

    init(cache: DataCache) {
        self.cache = cache
    }

    func loadData(key: String) async -> String {
        // Asinhrona piekļuve `actor`
        if let cached = await cache.cachedData(forKey: key) {
            return cached
        }

        // ... datu ielādes loģika ...
        let newData = "Data for \(key)"

        // Asinhrona `actor` atjaunināšana
        await cache.updateCache(key: key, value: newData)

        return newData
    }

    func attemptClearCacheAsync() async {
        // Asinhrona izsaukšana `actor` metodes no ārpuses
        await cache.clearCacheIsolated()
    }

    func attemptClearCacheDirect() {
        // Kompilatora kļūda:
        // `actor` izolēta instances metode `clearCacheIsolated()` nevar tikt izsaukta no ne-izolēta konteksta
        // cache.clearCacheIsolated()
    }
}

Šajā piemērā:

  • Metodes updateCache un cachedData tiek izpildītas DataCache izolētajā kontekstā un ir pieejamas sinhroni actor iekšienē.
  • Izsaukumi cache.cachedData(forKey: key) un cache.updateCache(key: key, value: newData) no loadData metodes (kas atrodas ārpus actor konteksta) prasa await vārdu, kas norāda uz asinhronu izpildi un asinhrona izpildītāja izmantošanu. actor izpildītājs ir atbildīgs par šo operāciju izpildi secībā, nodrošinot ekskluzīvu piekļuvi actor stāvoklim.
  • Metode clearCacheIsolated ir atzīmēta kā nonisolated, bet tai arī ir pieejama asinhrona izsaukšana await cache.clearCacheIsolated() no ārpuses actor, lai gan tas nav obligāti šajā gadījumā (jo šī metode nemaina actor stāvokli).
  • Tieša sinhrona izsaukšana cache.clearCacheIsolated() no ne-izolēta konteksta (kā attemptClearCacheDirect) izraisa kompilatora kļūdu, apstiprinot asinhronas piekļuves nepieciešamību.

Tādējādi, drošai mijiedarbībai ar actor no tā konteksta ir nepieciešams izmantot asinhronas izsaukumus, kas tiek veikti ar asinhrona izpildītāja palīdzību, ko pārvalda pats actor.