Ractors
Ægte parallelitet
Ractors er en gratis Ruby Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Ruby Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Ruby Academy-kurset indeholder 4 lektioner i alt.
Hvad er en Ractor?
En Ractor (Ruby-aktør) er en samtidighedsprimitiv, der blev introduceret i Ruby 3, og som giver ægte parallelisme. Hver Ractor kører Ruby-kode selvstændigt, så to Ractors kan bruge to CPU-kerner på samme tid.
- Ractors deler ikke foranderlige objekter, hvilket omgår GVL's begrænsning.
- De kommunikerer ved at sende meddelelser.
Ractors er stadig eksperimentelle, så Ruby udskriver en advarsel, når du bruger dem.
Oprettelse af en Ractor
Opret en med Ractor.new og en blok. Blokken kører parallelt. Brug take for at hente blokkens endelige værdi.
r = Ractor.new do
2 + 3
end
puts r.takeIngen delt tilstand
Den vigtigste regel er: Ractors kan ikke frit dele foranderlige objekter. En Ractor-blok indfanger ikke lokale variable fra det ydre område på den måde, en normal blok gør. Du skal sende data ind eksplicit.
Denne isolering gør parallel udførelse sikker uden låse.
Afsendelse af argumenter
Argumenter til Ractor.new leveres til blokkens parametre. Det er den sikre måde at sende data ind i en Ractor på.
r = Ractor.new(10) do |x|
x * x
end
puts r.takeAfsendelse af meddelelser
Ractors har en indbakke til meddelelser. Send med ractor.send(value), og modtag inde i blokken med Ractor.receive.
r = Ractor.new do
msg = Ractor.receive
"got: " + msg
end
r.send("hello")
puts r.takeSkub versus hent
To kommunikationsretninger:
- Skub:
sendtil en Ractor, og læs medRactor.receive. - Hent: En Ractor giver en værdi med
Ractor.yield, og koden udenfor læser den medtake.
Tilsammen lader de Ractors danne behandlingsforløb.
r = Ractor.new do
Ractor.yield 1
Ractor.yield 2
end
puts r.take
puts r.takeFastfrosne og delbare objekter
Nogle objekter kan deles på tværs af Ractors, fordi de ikke kan ændres: true, false, nil, tal, symboler og objekter, der er dybt fastfrosne.
Ractor.make_shareable fastfryser en objektgraf, så den kan deles sikkert.
data = Ractor.make_shareable([1, 2, 3])
puts "Frozen? " + data.frozen?.to_sKopiér eller flyt
Når du sender et objekt, der ikke kan deles, laver Ractor som standard en dyb kopi, så begge sider har deres egen kopi. Du kan i stedet flytte objektet med send(obj, move: true), hvilket overfører ejerskabet og gør originalen ubrugelig.
Flytning undgår kopieringsomkostningen for store objekter.
Parallelt arbejde
Opdel CPU-tungt arbejde mellem Ractors, og indsaml resultaterne. Fordi hver Ractor kører for sig selv, kan dette udnytte flere kerner.
ractors = (1..3).map do |n|
Ractor.new(n) do |x|
x * 100
end
end
results = ractors.map(&:take)
puts "Results: " + results.join(", ")Ractors og tråde
Sammenligning:
- Tråde deler hukommelse og kræver låse, mens Ractors er isolerede og kræver meddelelser.
- Tråde paralleliserer ikke Ruby-arbejde, der bruger CPU, mens Ractors gør.
- Ractors er mere strikse, hvilket forhindrer mange fejl ved samtidighed.
Ulempen er mere faste regler for datadeling.
Hvornår du bør bruge Ractors
Vælg Ractors når:
- Du har CPU-bundet arbejde og vil bruge flere kerner i én proces.
- Du ønsker isolation for at undgå fejl på grund af delt tilstand.
Husk, at de er eksperimentelle. API'er kan ændre sig, og mange gems er endnu ikke kompatible med Ractors.
Hurtig test
Test din forståelse af Ractors.
Opsummering: Ractors
Du har lært parallelitet i samme proces med Ractors:
Ractor.newkører kode parallelt, ogtakehenter resultatet.- Send data ind via argumenter eller
send, og modtag dem medRactor.receive. - Objekter kopieres eller flyttes i stedet for at blive delt frit.
Ractor.make_shareablegør data uforanderlige, så de kan deles sikkert.
Det afslutter kurset i Ruby-samtidighed: tråde, GVL, fibers og Ractors.
Lær Ruby med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 29
- Lektioner
- 109
Ofte stillede spørgsmål
Er lektionen “Ractors” gratis?
Ja — alle 3 lektioner i læringssporet Ruby Academy, inklusive “Ractors”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Ruby Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Ractors”?
Ægte parallelitet Du øver dig i Ruby Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Ruby Academy?
Der kræves ingen tidligere erfaring. Ruby Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Ractors”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Ruby Academy-lektion?
Ja. Alle Ruby Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Tråde
- GVL forklaret
- Fibers
- Ractors