Ractors
Verklig parallellism.
Ractors är en gratis lektion i Ruby Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Ruby Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Ruby Academy innehåller totalt 4 lektioner.
Vad är en Ractor?
En Ractor (Ruby Actor) är en mekanism för samtidighet som introducerades i Ruby 3 och ger verklig parallellism. Varje Ractor kör Ruby-kod självständigt, så två Ractors kan använda två CPU-kärnor samtidigt.
- Ractors delar inte förändringsbara objekt, vilket kringgår GVL:s begränsning.
- De kommunicerar genom att skicka meddelanden.
Ractors är fortfarande experimentella, så Ruby skriver ut en varning när du använder dem.
Skapa en Ractor
Skapa en med Ractor.new och ett block. Blocket körs parallellt. Använd take för att hämta blockets slutliga värde.
r = Ractor.new do
2 + 3
end
puts r.takeInget delat tillstånd
Den viktigaste regeln är att Ractors inte fritt kan dela förändringsbara objekt. Ett Ractor-block fångar inte yttre lokala variabler på samma sätt som ett vanligt block gör. Du måste skicka in data uttryckligen.
Det är denna isolering som gör parallell körning säker utan lås.
Skicka in argument
Argument till Ractor.new skickas till blockets parametrar. Det här är det säkra sättet att skicka data till en Ractor.
r = Ractor.new(10) do |x|
x * x
end
puts r.takeSkicka meddelanden
Ractors har en inkorg för meddelanden. Skicka med ractor.send(value) och ta emot inuti blocket med Ractor.receive.
r = Ractor.new do
msg = Ractor.receive
"got: " + msg
end
r.send("hello")
puts r.takePush kontra pull
Två kommunikationsriktningar:
- Push: skicka in i en Ractor med
sendoch läs medRactor.receive. - Pull: en Ractor lämnar ett värde med
Ractor.yield, och koden utanför läser det medtake.
Tillsammans gör de att Ractors kan bilda pipelines.
r = Ractor.new do
Ractor.yield 1
Ractor.yield 2
end
puts r.take
puts r.takeFrysta och delbara objekt
Vissa objekt kan delas mellan Ractors eftersom de inte kan ändras: true, false, nil, tal, symboler och djupt frysta objekt.
Ractor.make_shareable fryser en objektgraf så att den kan delas säkert.
data = Ractor.make_shareable([1, 2, 3])
puts "Frozen? " + data.frozen?.to_sKopiera eller flytta
När du skickar ett objekt som inte kan delas gör Ractor som standard en djup kopia av det, så att varje sida får sitt eget. Du kan i stället flytta det med send(obj, move: true), vilket överför ägarskapet och gör originalet obrukbart.
Att flytta undviker kopieringskostnaden för stora objekt.
Parallellt arbete
Dela upp processorintensivt arbete mellan Ractors och samla in resultaten. Eftersom varje Ractor körs separat kan detta utnyttja flera kärnor.
ractors = (1..3).map do |n|
Ractor.new(n) do |x|
x * 100
end
end
results = ractors.map(&:take)
puts "Results: " + results.join(", ")Ractors jämfört med trådar
Jämförelse:
- Trådar delar minne och behöver lås; Ractors är isolerade och behöver meddelanden.
- Trådar kör inte Ruby-beräkningar parallellt; Ractors gör det.
- Ractors är striktare, vilket förhindrar många samtidighetsbuggar.
Avvägningen är striktare regler för datadelning.
När du bör använda Ractors
Välj Ractors när:
- Du har CPU-bundet arbete och vill använda flera kärnor i en enda process.
- Du vill ha isolering för att undvika buggar som beror på delat tillstånd.
Tänk på att de är experimentella; API:er kan ändras och många gems är ännu inte kompatibla med Ractor.
Snabbkontroll
Testa din förståelse av Ractors.
Sammanfattning: Ractors
Du har lärt dig om parallellism i processen med Ractors:
Ractor.newkör kod parallellt;takehämtar resultatet.- Skicka in data via argument eller
send; ta emot den medRactor.receive. - Objekt kopieras eller flyttas, men delas inte fritt.
Ractor.make_shareablefryser data så att den kan delas säkert.
Detta avslutar kursen Ruby Concurrency: trådar, GVL, fibrer och Ractors.
Lär dig Ruby med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 29
- Lektioner
- 109
Vanliga frågor
Är lektionen ”Ractors” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Ruby Academy, inklusive ”Ractors”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Ruby Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Ractors”?
Verklig parallellism. Ni övar på Ruby Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Ruby Academy?
Du behöver inga förkunskaper. Utbildningen i Ruby Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Ractors”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Ruby Academy-lektionen?
Ja. Varje Ruby Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Trådar
- GVL förklarad
- Fibers
- Ractors