Ractor
Vero parallelismo
Ractor è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Ruby Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Ruby Academy include 4 lezioni in totale.
Che cos'è un Ractor?
Un Ractor (Ruby Actor) è un costrutto di concorrenza introdotto in Ruby 3 che offre un vero parallelismo. Ogni Ractor esegue autonomamente il codice Ruby, quindi due Ractor possono utilizzare contemporaneamente due core della CPU.
- I Ractor non condividono oggetti mutabili, aggirando così la limitazione del GVL.
- Comunicano inviandosi messaggi.
I Ractor sono ancora sperimentali, quindi Ruby stampa un avviso quando li utilizza.
Creare un Ractor
Ne crei uno con Ractor.new e un blocco. Il blocco viene eseguito in parallelo. Usi take per ottenere il valore finale del blocco.
r = Ractor.new do
2 + 3
end
puts r.takeNessuno stato condiviso
La regola fondamentale è questa: i Ractor non possono condividere liberamente oggetti mutabili. Un blocco di Ractor non cattura le variabili locali esterne come farebbe un normale blocco. Deve passare i dati esplicitamente.
È questo isolamento a rendere sicura l'esecuzione parallela senza lock.
Passare argomenti all'interno
Gli argomenti di Ractor.new vengono passati ai parametri del blocco. Questo è il modo sicuro per inviare dati a un Ractor.
r = Ractor.new(10) do |x|
x * x
end
puts r.takeInviare messaggi
I Ractor dispongono di una casella di posta per i messaggi. Invii messaggi con ractor.send(value) e li riceva all'interno del blocco con Ractor.receive.
r = Ractor.new do
msg = Ractor.receive
"got: " + msg
end
r.send("hello")
puts r.takePush e pull
Due direzioni di comunicazione:
- Push: inviare dati con
senda un Ractor e leggerli conRactor.receive. - Pull: un Ractor produce dati con
Ractor.yielde l'esterno li legge contake.
Insieme, questi meccanismi consentono ai Ractor di formare pipeline.
r = Ractor.new do
Ractor.yield 1
Ractor.yield 2
end
puts r.take
puts r.takeOggetti congelati e condivisibili
Alcuni oggetti sono condivisibili tra Ractor perché non possono essere modificati: true, false, nil, numeri, simboli e oggetti congelati in profondità.
Ractor.make_shareable congela un grafo di oggetti, così può essere condiviso in sicurezza.
data = Ractor.make_shareable([1, 2, 3])
puts "Frozen? " + data.frozen?.to_sCopia o spostamento
Quando si invia un oggetto non condivisibile, Ractor ne crea per impostazione predefinita una copia profonda, così ciascun lato ne ha una propria. In alternativa, è possibile spostarlo con send(obj, move: true), trasferendone la proprietà e rendendo inutilizzabile l'originale.
Lo spostamento evita il costo della copia per gli oggetti di grandi dimensioni.
Lavoro parallelo
Suddivida il lavoro pesante per la CPU tra più Ractor e raccolga i risultati. Poiché ciascuno viene eseguito in autonomia, è possibile utilizzare più core.
ractors = (1..3).map do |n|
Ractor.new(n) do |x|
x * 100
end
end
results = ractors.map(&:take)
puts "Results: " + results.join(", ")Ractor e thread
Confronto:
- I thread condividono la memoria e richiedono lock; i Ractor sono isolati e richiedono messaggi.
- I thread non eseguono in parallelo il lavoro della CPU in Ruby; i Ractor sì.
- I Ractor impongono regole più rigide, evitando così molti bug di concorrenza.
Il compromesso consiste in regole più rigide per la condivisione dei dati.
Quando usare Ractor
Scelga Ractor quando:
- Ha attività vincolate dalla CPU e vuole utilizzare più core in un unico processo.
- Vuole l'isolamento per evitare bug dovuti allo stato condiviso.
Ricordi che sono sperimentali: le API possono cambiare e molte gem non sono ancora compatibili con Ractor.
Verifica rapida
Verifichi la comprensione dei Ractor.
Riepilogo: Ractor
Ha appreso il parallelismo all'interno del processo con i Ractor:
Ractor.newesegue il codice in parallelo;takene recupera il risultato.- Passi i dati tramite argomenti o
send; li riceva conRactor.receive. - Gli oggetti vengono copiati o spostati, non condivisi liberamente.
Ractor.make_shareablerende i dati immutabili per condividerli in sicurezza.
In questo modo completa il corso sulla concorrenza in Ruby: thread, GVL, fiber e Ractor.
Domande Frequenti
La lezione «Ractor» è gratuita?
Sì — il testo completo di «Ractor» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Ruby Academy, passa a CoddyKit PRO. Il corso Ruby Academy include 4 lezioni in totale.
Cosa imparerò in «Ractor»?
Vero parallelismo Eserciti Ruby Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Ruby Academy?
Non è richiesta alcuna esperienza precedente. Ruby Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Ractor»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Ruby Academy?
Sì. Ogni lezione Ruby Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.