Ruby Academy · Oppitunti

Säikeet

Samanaikainen suoritus.

Oppitunti 1/413 vaihetta

Säikeet on ilmainen Ruby Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/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 Ruby Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Ruby Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on säie?

Säie on ohjelman sisäinen itsenäinen suorituspolku. Rubylla voitte suorittaa useita säikeitä, jolloin työt voivat edetä osittain samanaikaisesti.

  • Pääohjelma suoritetaan pääsäikeessä.
  • Voitte luoda lisää säikeitä komennolla Thread.new.
  • Säikeet jakavat saman muistin, joten ne voivat lukea ja kirjoittaa samoihin muuttujiin.

Säikeet sopivat erityisen hyvin tilanteisiin, joissa ohjelman aika kuluu odottamiseen (verkko, levy, sleep), koska yksi säie voi odottaa toisen jatkaessa työskentelyä.

Säikeen luominen

Välittäkää lohko komennolle Thread.new. Lohko suoritetaan uudessa säikeessä. Kutsukaa join-metodia ja odottakaa sen valmistumista ennen ohjelman päättymistä.

t = Thread.new do
  puts "Hello from the new thread"
end

t.join
puts "Main thread done"

Miksi join on tärkeä

Kun pääsäie päättyy, Ruby lopettaa ohjelman eikä välttämättä odota muita säikeitä. join estää kutsuvan säikeen suorituksen, kunnes kohdesäie on valmis.

Ilman join-kutsua työntekijäsäie ei ehkä ehdi tulostaa mitään ennen ohjelman päättymistä.

t = Thread.new do
  sleep 0.1
  puts "Worker finished"
end

puts "Waiting..."
t.join
puts "All done"

Useita säikeitä kerralla

Voitte käynnistää joukon säikeitä, kerätä ne taulukkoon ja kutsua sitten join-metodia jokaiselle niistä. Tämä on yleinen malli lähes rinnakkaiseen I/O-työhön.

threads = (1..3).map do |n|
  Thread.new do
    puts "Thread number " + n.to_s
  end
end

threads.each(&:join)
puts "Finished all threads"

Muuttujien jakaminen

Säikeet jakavat muistin. Ennen säiettä määritelty muuttuja näkyy myös sen sisällä. Tämä on tehokasta, mutta myös vaarallista, jos kaksi säiettä kirjoittaa samaan arvoon.

counter = 0

t = Thread.new do
  counter += 1
end

t.join
puts "Counter is " + counter.to_s

Kilpailutilanteet

Kilpailutilanne syntyy, kun säikeet lomittavat jaettujen tietojen päivityksiä ja tulos riippuu ajoituksesta.

  • counter += 1 tarkoittaa todellisuudessa lukemista, lisäämistä ja kirjoittamista.
  • Kaksi säiettä voi lukea saman vanhan arvon ja kirjoittaa kumpikin saman uuden arvon, jolloin toinen lisäys menetetään.

Ratkaisu on koordinoida käyttöä lukolla.

Mutex: lukko

Mutex (poissulkeminen) varmistaa, että vain yksi säie kerrallaan suorittaa suojattua koodia. Kääritkää kriittinen osio komennolla mutex.synchronize.

mutex = Mutex.new
counter = 0

threads = (1..5).map do
  Thread.new do
    mutex.synchronize do
      counter += 1
    end
  end
end

threads.each(&:join)
puts "Counter is " + counter.to_s

Arvon palauttaminen

Thread#value odottaa säikeen valmistumista ja palauttaa sen lohkon arvon. Se toimii kuin automaattinen join-kutsu, joka palauttaa lisäksi tuloksen.

t = Thread.new do
  2 + 3
end

puts "Result is " + t.value.to_s

Säiekohtaiset muuttujat

Jokainen säie voi tallentaa omia arvojaan symbolin avulla avaimella Thread.current[:key]. Nämä arvot ovat kyseisen säikeen yksityisiä, eikä niitä jaeta muiden kanssa.

t = Thread.new do
  Thread.current[:name] = "worker"
  puts "Inside: " + Thread.current[:name]
end

t.join

Poikkeusten käsittely

Jos säie nostaa virheen, se pysyy piilossa, kunnes kutsutte join- tai value-metodia, joka nostaa virheen uudelleen. Asettamalla Thread.abort_on_exception = true saatte virheet kaatamaan koko ohjelman heti, mikä helpottaa virheenkorjausta.

t = Thread.new do
  raise "boom"
end

begin
  t.join
rescue => e
  puts "Caught: " + e.message
end

Milloin säikeistä on hyötyä

Säikeet ovat parhaimmillaan I/O-painotteisessa työssä, jossa aikaa kuluu odottamiseen. Niistä on vähemmän hyötyä CPU-painotteisessa työssä GVL:n vuoksi (käsittelemme sen seuraavaksi).

  • Sopii hyvin: useiden URL-osoitteiden lataamiseen ja useiden tiedostojen lukemiseen.
  • Rajoitettu hyöty: raskaaseen laskentaan useilla suorittimen ytimillä.

Suojatkaa jaettu muokattava tila aina Mutex-oliolla.

Pikatarkistus

Testatkaa, kuinka hyvin ymmärrätte säikeitä.

Kertaus: säikeet

Opitte Ruby-säikeiden perusteet:

  • Thread.new aloittaa samanaikaisen suorituksen.
  • join odottaa; value odottaa ja palauttaa tuloksen.
  • Säikeet jakavat muistin, mikä voi aiheuttaa kilpailutilanteita.
  • Mutex yhdessä synchronize-metodin kanssa suojaa jaettua tilaa.
  • Säikeet sopivat erinomaisesti I/O-painotteiseen työhön.

Seuraavaksi tutkimme, miksi säikeet eivät voi hyödyntää kaikkia suorittimen ytimiä samanaikaisesti: GVL:ää.

Aloita maksutta

Opi Ruby 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
29
Oppitunnit
109

Usein kysytyt kysymykset

Onko oppitunti ”Säikeet” ilmainen?

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

Mitä opin oppitunnilla ”Säikeet”?

Samanaikainen suoritus. Harjoittelet Ruby Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Ruby Academy-opiskelun?

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

Kuinka kauan ”Säikeet”-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ä Ruby Academy-oppitunnilla?

Kyllä. Jokainen Ruby 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. Säikeet
  2. GVL selitettynä
  3. Fiberit
  4. Ractorit
← Takaisin: Ruby Academy