Säikeet
Samanaikainen suoritus.
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_sKilpailutilanteet
Kilpailutilanne syntyy, kun säikeet lomittavat jaettujen tietojen päivityksiä ja tulos riippuu ajoituksesta.
counter += 1tarkoittaa 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_sArvon 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_sSä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.joinPoikkeusten 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
endMilloin 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.newaloittaa samanaikaisen suorituksen.joinodottaa;valueodottaa ja palauttaa tuloksen.- Säikeet jakavat muistin, mikä voi aiheuttaa kilpailutilanteita.
Mutexyhdessä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:ää.
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.