Swift Academy · Oppitunti

Actor-eristys ja nonisolated

Päättele eristysrajojen toimintaa.

Oppitunti 3/413 vaihetta

Actor-eristys ja nonisolated on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Mitä actor-eristys tarkoittaa

Actor-eristys tarkoittaa, että actorin muokattavaan tilaan voi koskea vain actorilla suoritettava koodi.

Ajoympäristö sarjallistaa käytön, joten kaksi tehtävää ei koskaan muuta tilaa samanaikaisesti. Näin datakilpailut poistuvat.

actor Counter {
    private var value = 0
    func increment() { value += 1 }
}

Kutsuminen actorille

Actorin ulkopuolelta eristettyjen jäsenten käyttäminen on asynkronista. Teidän on käytettävä await-sanaa, koska kutsu voi keskeytyä, kunnes actor vapautuu.

let counter = Counter()
func useCounter() async {
    await counter.increment()
}

Actorin sisällä: synkronisesti

Actorin omissa metodeissa olette jo eristetyssä kontekstissa, joten pääsette tilaan käsiksi synkronisesti – await-sanaa ei tarvita self-viitteelle.

actor Counter {
    private var value = 0
    func incrementTwice() {
        value += 1 // synchronous: already isolated
        value += 1
    }
}

nonisolated-jäsenet

Merkitkää jäsen nonisolated-merkinnällä, kun se ei käsittele muokattavaa tilaa. Tällaiset jäsenet suoritetaan synkronisesti mistä tahansa ilman await-sanaa.

Tämä sopii erinomaisesti laskettuihin arvoihin, jotka muodostetaan vain muuttumattomista tiedoista.

actor User {
    let id: Int
    var sessionCount = 0
    init(id: Int) { self.id = id }
    nonisolated var label: String { "User #\(id)" }
}

Miksi nonisolated on turvallinen

nonisolated-jäsen voi lukea vain muuttumatonta (let) tai muuten Sendable-tilaa.

Kääntäjä hylkää yrityksen käyttää muokattavaa eristettyä tilaa nonisolated-kontekstista.

actor User {
    let id: Int
    var sessionCount = 0
    init(id: Int) { self.id = id }
    // Error: cannot read mutable sessionCount here
    // nonisolated var bad: Int { sessionCount }
}

nonisolated ja protokollat

nonisolated on välttämätön, kun actor toteuttaa synkronisen protokollan. Protokollan metodi ei voi olla asynkroninen, joten se ei saa käyttää eristettyä tilaa.

actor Item: CustomStringConvertible {
    let name: String
    init(name: String) { self.name = name }
    nonisolated var description: String { "Item: \(name)" }
}

MainActor

@MainActor on globaali actor, joka eristää koodin pääsäikeeseen. Käyttöliittymän päivitykset kuuluvat tänne.

Merkitkää tyypit, metodit tai ominaisuudet, jos haluatte sitoa ne MainActorille.

@MainActor
final class ViewModel {
    var title = "Hello"
    func refresh() { title = "Updated" }
}

Siirtyminen actorien välillä

Kun kutsutte yhdeltä actorilta toiselle, ajoympäristö siirtyy suorittajalta toiselle ja keskeyttää suorituksen. Juuri tässä keskeytyskohdassa await esiintyy.

actor Database { func load() -> Int { 42 } }
@MainActor
func show(_ db: Database) async {
    let v = await db.load() // hop to db actor
    print(v)               // hop back to main
}

Actorien reentrancy

Actorit ovat reentrant: kun metodi odottaa, actor voi suorittaa muuta jonossa olevaa työtä ennen kuin suoritus jatkuu odotuksen jälkeen.

Ennen await-sanaa lukemanne tila on voinut muuttua sen jälkeen. Tarkistakaa oletukset uudelleen keskeytyskohtien jälkeen.

actor Store {
    var ready = false
    func prepare() async {
        ready = false
        await Task.yield() // other calls may run here
        ready = true
    }
}

isolated-parametrit

Funktio voi ottaa isolated-actor-parametrin, jolloin sen runko suoritetaan kyseisellä actorilla, vaikka funktio ei ole actorin jäsen.

func bump(on counter: isolated Counter) {
    // runs isolated to counter; synchronous access
}

Globaalit actorit alijärjestelmille

Voitte määrittää oman globaalin actorin, jolla koko alijärjestelmä (esimerkiksi renderöintiputki) eristetään yhdelle suorittajalle.

@globalActor
actor RenderActor {
    static let shared = RenderActor()
}
@RenderActor func draw() { }

Pikatarkistus: eristys

Testatkaa ymmärrystänne actor-eristyksestä.

Kertaus: actor-eristys ja nonisolated

Actor-eristys sarjallistaa pääsyn muokattavaan tilaan; actorien väliset kutsut ovat asynkronisia ja edellyttävät await-sanaa. nonisolated-jäsenet jättäytyvät eristyksen ulkopuolelle, mutta voivat lukea vain muuttumatonta tai Sendable-tilaa, mikä on tärkeää synkronisen protokollan toteuttamisessa.

@MainActor sitoo koodin pääsäikeeseen, actorit ovat reentrant-tyyppisiä (tila voi muuttua await-sanan yli), ja globaalit actorit eristävät kokonaisia alijärjestelmiä. Näiden sääntöjen hallitseminen on turvallisen samanaikaisuuden ydin.

Aloita maksutta

Opi Swift tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
122
Oppitunnit
409

Usein kysytyt kysymykset

Onko oppitunti ”Actor-eristys ja nonisolated” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Actor-eristys ja nonisolated”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Actor-eristys ja nonisolated”?

Päättele eristysrajojen toimintaa. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Actor-eristys ja nonisolated”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?

Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Datakilpailun ongelma
  2. Sendable-protokolla
  3. Actor-eristys ja nonisolated
  4. Siirtyminen tiukkaan samanaikaisuuden tarkistukseen
← Takaisin: Swift Academy