Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys · Oppitunti

Refit, agentit ja atomit tilanhallintaan

Opitte käyttämään Clojuren keskeisiä rinnakkaisuuden primitiivejä muuttuvan tilan turvalliseen hallintaan säikeiden välillä.

Oppitunti 1/413 vaihetta

Refit, agentit ja atomit tilanhallintaan on ilmainen Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-kurssilla on yhteensä 4 oppituntia.

Johdanto rinnakkaisuuteen ja tilaan

Rinnakkaisten ohjelmien tilan hallinta on haastavaa! Kun useat koodin osat yrittävät muuttaa samoja tietoja samanaikaisesti, seurauksena voi olla vakavia ongelmia, kuten tietojen korruptoitumista tai lukkiutumia.

Clojure tarjoaa tehokkaita työkaluja jaetun muuttuvan tilan turvalliseen ja tehokkaaseen käsittelyyn.

Clojuren filosofia tilasta

Clojure käyttää oletusarvoisesti muuttumattomuutta. Tämä tarkoittaa, etteivät tietorakenteet muutu luomisen jälkeen. Entä jos jotakin täytyy aidosti muuttaa, kuten laskuria tai käyttäjän saldoa?

  • Clojure tarjoaa erityisiä rinnakkaisuuden primitiivejä.
  • Nämä primitiivit hallitsevat muuttuvaa tilaa hallitusti.
  • Ne varmistavat muutosten turvallisuuden myös useiden säikeiden välillä.

Atomit: itsenäinen tila

Atom on yksinkertaisin tapa hallita yhtä itsenäistä muuttuvan tilan osaa. Se sopii hyvin esimerkiksi laskureihin ja lippuihin.

  • Päivitykset ovat synkronisia ja atomisia (joko kaikki tapahtuu tai mikään ei tapahdu).
  • Atomit käyttävät sisäisesti Compare-And-Swap (CAS) -silmukkaa.
  • Atomit sopivat parhaiten tilaan, jota ei tarvitse koordinoida muiden tilan osien kanssa.

Esimerkki atomista

Katsotaan atomia käytännössä. Luomme yksinkertaisen laskurin ja päivitämme sitä.

(ns coddykit.core
  (:gen-class))

(defn -main
  "Demonstrates Clojure Atoms."
  [& args]
  (let [my-counter (atom 0)]
    (println "Initial value:" @my-counter)

    (swap! my-counter inc)
    (println "After inc:" @my-counter)

    (swap! my-counter + 5)
    (println "After add 5:" @my-counter)))

Atomin `swap!`-funktion selitys

swap!-funktio on keskeinen atomien päivittämisessä:

  • Se ottaa parametriksi atomin, funktion ja kyseisen funktion valinnaiset argumentit.
  • (swap! my-atom inc) kasvattaa arvoa atomisesti.
  • (swap! my-atom + 5) lisää arvoon atomisesti luvun 5.
  • Funktiota sovelletaan atomin nykyiseen arvoon, ja tuloksesta tulee uusi arvo. Tämä tapahtuu säieturvallisesti.

Refit: koordinoitu tila

Refit on tarkoitettu koordinoidun muuttuvan tilan hallintaan. Tämä tarkoittaa, että useiden tilan osien täytyy muuttua yhdessä tai ei lainkaan.

  • Refit käyttävät Clojuren Software Transactional Memory (STM) -tekniikkaa.
  • Muutokset tapahtuvat transaktion sisällä (dosync-lohkossa).
  • Kaikki transaktion muutokset joko onnistuvat tai epäonnistuvat ryhmänä.

Esimerkki refeistä

Näin refejä käytetään arvon siirtämiseen kahden tilin välillä atomisesti. Jos toinen epäonnistuu, molempien muutokset perutaan.

(ns coddykit.core
  (:gen-class))

(defn -main
  "Demonstrates Clojure Refs and STM."
  [& args]
  (let [account-a (ref 100)
        account-b (ref 50)
        amount-to-transfer 20]

    (println "Initial: A=" @account-a "B=" @account-b)

    (dosync
      (alter account-a - amount-to-transfer)
      (alter account-b + amount-to-transfer))

    (println "After transfer: A=" @account-a "B=" @account-b)))

STM refeillä – selitys

dosync-lohko määrittelee transaktion:

  • ref luo uuden refin.
  • alter muuttaa refin arvoa transaktion sisällä. Se ottaa parametriksi refin, funktion ja sen argumentit.
  • Jos jokin dosync-lohkon osa epäonnistuu, kaikki muutokset perutaan.
  • Tämä varmistaa atomisuuden: joko kaikki tapahtuu tai mikään ei tapahdu.

Agentit: asynkroninen tila

Agentit on suunniteltu muuttuvan tilan hallintaan asynkronisesti ja eristetysti. Ne sopivat erinomaisesti tehtäviin, jotka saattavat kestää jonkin aikaa tai suoritetaan taustalla ilman, että pääsäie estyy.

  • Päivitykset lähetetään viesteinä Agentille.
  • Agentti käsittelee nämä viestit erillisessä säikeessä.
  • Tämä tarjoaa eristyksen: agentin tila muuttuu vain sen oman käsittelyn kautta.

Agentin koodiesimerkki

Käytetään Agenttia lukujen luettelon käsittelemiseen asynkronisesti ja lasketaan niiden summa.

(ns coddykit.core
  (:gen-class))

(defn -main
  "Demonstrates Clojure Agents."
  [& args]
  (let [sum-agent (agent 0)]
    (println "Initial sum:" @sum-agent)

    (send sum-agent + 10)
    (send sum-agent + 20)
    (send sum-agent + 5)

    (println "Waiting for agent to finish...")
    (await sum-agent) ; Wait for all sent actions to complete
    
    (println "Final sum:" @sum-agent)))

Agentin työnkulku

Näin Agentit toimivat:

  • agent luo uuden Agentin, jolla on alkuarvo.
  • send välittää funktion ja argumentit agentille. Funktio suoritetaan agentin nykyiselle tilalle toisessa säikeessä.
  • Agentti käsittelee viestit yksi kerrallaan omassa säikeessään, mikä varmistaa päivitysten eristyksen.
  • await (tai await-for) estää nykyisen säikeen toiminnan, kunnes agentti on käsitellyt kaikki odottavat toiminnot.

Oikean primitiivin valitseminen

Olette tutustuneet Atomeihin, Ref-viittauksiin ja Agentteihin. Jokaisella on oma tarkoituksensa muuttuvan tilan turvallisessa hallinnassa.

Mitkä seuraavista väitteistä kuvaavat oikein, milloin kutakin rinnakkaisuusprimitiiviä käytetään?

Kertaus: tilan hallinta

Tässä oppitunnissa tutustuimme Clojuren keskeisiin rinnakkaisuusprimitiiveihin muuttuvan tilan turvallista hallintaa varten:

  • Atomit: yksinkertaisiin, toisistaan riippumattomiin ja synkronisiin tilan muutoksiin.
  • Ref-viittaukset: useiden arvojen koordinoituihin, transaktionaalisiin tilan muutoksiin STM:n avulla.
  • Agentit: asynkronisiin ja eristettyihin tilan päivityksiin, jotka käsitellään erillisessä säikeessä.

Näiden työkalujen ymmärtäminen on olennaista vakaiden ja rinnakkaisten Clojure-sovellusten rakentamisessa!

Aloita maksutta

Opi Clojure 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
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Refit, agentit ja atomit tilanhallintaan” ilmainen?

Kyllä – oppitunnin ”Refit, agentit ja atomit tilanhallintaan” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-kurssin, päivitä CoddyKit PROhon. Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Refit, agentit ja atomit tilanhallintaan”?

Opitte käyttämään Clojuren keskeisiä rinnakkaisuuden primitiivejä muuttuvan tilan turvalliseen hallintaan säikeiden välillä. Harjoittelet Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Refit, agentit ja atomit tilanhallintaan”-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ä Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-oppitunnilla?

Kyllä. Jokainen Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys-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. Refit, agentit ja atomit tilanhallintaan
  2. Ohjelmiston transaktionaalinen muisti (STM)
  3. Promiset, futuret ja asynkroniset operaatiot
  4. core.async-kanavat ja go-lohkot
← Takaisin: Clojure-funktionaalinen ohjelmointi ja JVM-backend-kehitys