0Pricing
Ruby Academy · Lezione

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.resume

Passare 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.resume

Passare 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_s

Fiber 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 yield o resume.
  • 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.next

Fiber 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.new insieme a resume esegue e fa proseguire un fiber.
  • Fiber.yield mette 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.

Tutte le lezioni di questo corso

  1. Thread
  2. Il GVL spiegato
  3. Fiber
  4. Ractor
← Torna a Ruby Academy