Fiber
Concorrenza cooperativa
Fiber è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 3 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 Fiber?
Un Fiber è un'unità di esecuzione leggera che controlla manualmente. A differenza dei thread, un fiber non viene mai eseguito autonomamente: deve cedergli esplicitamente il controllo, dopodiché lo restituisce.
- Questa modalità si chiama concorrenza cooperativa.
- I fiber sono economici da creare e mettere in pausa.
- Costituiscono la base dei generatori e dell'I/O asincrono in Ruby.
Creare e riprendere un Fiber
Crei un fiber con Fiber.new e lo avvii o lo faccia proseguire con resume. Il blocco viene eseguito finché non termina o viene messo in pausa.
fiber = Fiber.new do
puts "Inside the fiber"
end
fiber.resume
puts "Back in main"Mettere in pausa con yield
Fiber.yield mette in pausa il fiber e restituisce il controllo a chi ha chiamato resume. Il successivo resume riprende l'esecuzione subito dopo yield.
fiber = Fiber.new do
puts "Step 1"
Fiber.yield
puts "Step 2"
end
fiber.resume
puts "Main between steps"
fiber.resumePassare valori all'esterno
L'argomento di Fiber.yield diventa il valore restituito da resume. In questo modo un fiber può produrre su richiesta una sequenza di valori.
fiber = Fiber.new do
Fiber.yield 10
Fiber.yield 20
30
end
puts fiber.resume
puts fiber.resume
puts fiber.resumePassare valori all'interno
L'argomento di resume diventa il valore restituito da Fiber.yield all'interno del fiber. La comunicazione avviene in entrambe le direzioni.
fiber = Fiber.new do
got = Fiber.yield "ready"
puts "Fiber received: " + got
end
puts fiber.resume
fiber.resume("hello")Un contatore infinito
Poiché un fiber può essere messo in pausa e ripreso, può rappresentare una sequenza lazy infinita senza calcolarla interamente in anticipo.
counter = Fiber.new do
n = 1
loop do
Fiber.yield n
n += 1
end
end
3.times { puts counter.resume }Verificare se è attivo
Fiber#alive? indica se il fiber può ancora essere ripreso. Riprendere un fiber terminato solleva un FiberError.
fiber = Fiber.new { puts "done" }
puts "Alive before: " + fiber.alive?.to_s
fiber.resume
puts "Alive after: " + fiber.alive?.to_sFiber e thread a confronto
Differenze principali:
- I thread vengono pianificati dal runtime; i fiber vengono pianificati da Lei.
- I thread possono essere interrotti in qualsiasi momento; i fiber cambiano esecuzione solo con
yieldoresume. - I fiber evitano le condizioni di gara perché ne viene eseguito uno solo e i punti di cambio sono espliciti.
Gli enumeratori usano i Fiber
Gli enumeratori lazy di Ruby sono basati sui fiber. Un iteratore esterno si mette in pausa tra un valore e l'altro, proprio come un fiber esegue yield.
enum = Enumerator.new do |y|
y << 1
y << 2
y << 3
end
puts enum.next
puts enum.nextFiber e I/O asincrono
Le versioni moderne di Ruby includono un hook per il fiber scheduler. Librerie come la gem async lo utilizzano affinché, quando un fiber attende l'I/O, lo scheduler riprenda automaticamente un altro fiber.
In questo modo si ottiene un'elevata concorrenza sull'I/O con codice che si legge come il normale codice sequenziale.
Quando usare i Fiber
Scelga i fiber quando ha bisogno di:
- Generatori lazy che producono valori su richiesta.
- Un flusso di controllo in stile coroutine.
- Cambi di esecuzione granulari e deterministici senza lock.
Per la maggior parte delle attività di concorrenza quotidiane, i thread o la gem async (che utilizza i fiber internamente) sono più semplici.
Verifica rapida
Verifichi la sua comprensione dei fiber.
Riepilogo: i Fiber
Ha appreso la concorrenza cooperativa con i fiber:
Fiber.newinsieme aresumeesegue e fa proseguire un fiber.Fiber.yieldmette in pausa il fiber e restituisce il controllo.- I valori fluiscono in entrambe le direzioni tramite gli argomenti di yield e resume.
- I fiber alimentano gli enumeratori e gli scheduler per l'I/O asincrono.
Prossimamente: i Ractor, che offrono finalmente un vero parallelismo.
Domande Frequenti
La lezione «Fiber» è gratuita?
Sì — il testo completo di «Fiber» è 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 «Fiber»?
Concorrenza cooperativa 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 3 di 4.
Quanto tempo richiede la lezione «Fiber»?
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.