Ruby Academy · Lektion

Fibers

Kooperativ samtidighed

Lektion 3 af 413 trin

Fibers er en gratis Ruby Academy-lektion på CoddyKit. Dette er lektion 3 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 Fiber?

En Fiber er en letvægtsenhed til udførelse, som du selv styrer. I modsætning til tråde kører en fiber aldrig af sig selv; du giver den eksplicit kontrollen, og den giver kontrollen tilbage.

  • Dette kaldes kooperativ samtidighed.
  • Fibers er billige at oprette og sætte på pause.
  • De er grundlaget for generatorer og asynkron I/O i Ruby.

Oprettelse og genoptagelse

Opret en fiber med Fiber.new, og start eller genoptag den med resume. Blokken kører, indtil den afsluttes eller sættes på pause.

fiber = Fiber.new do
  puts "Inside the fiber"
end

fiber.resume
puts "Back in main"

Pause med yield

Fiber.yield sætter fiberen på pause og giver kontrollen tilbage til den, der kaldte resume. Den næste resume fortsætter lige efter yield.

fiber = Fiber.new do
  puts "Step 1"
  Fiber.yield
  puts "Step 2"
end

fiber.resume
puts "Main between steps"
fiber.resume

Afsendelse af værdier

Argumentet til Fiber.yield bliver returværdien fra resume. Det lader en fiber producere en række værdier efter behov.

fiber = Fiber.new do
  Fiber.yield 10
  Fiber.yield 20
  30
end

puts fiber.resume
puts fiber.resume
puts fiber.resume

Modtagelse af værdier

Argumentet til resume bliver returværdien fra Fiber.yield inde i fiberen. Kommunikationen går begge veje.

fiber = Fiber.new do
  got = Fiber.yield "ready"
  puts "Fiber received: " + got
end

puts fiber.resume
fiber.resume("hello")

En uendelig tæller

Fordi en fiber sættes på pause og genoptages, kan den repræsentere en uendelig, doven sekvens uden nogensinde at beregne det hele.

counter = Fiber.new do
  n = 1
  loop do
    Fiber.yield n
    n += 1
  end
end

3.times { puts counter.resume }

Sådan tjekker du, om den er i live

Fiber#alive? fortæller dig, om fiberen stadig kan genoptages. Genoptagelse af en død fiber udløser en FiberError.

fiber = Fiber.new { puts "done" }
puts "Alive before: " + fiber.alive?.to_s
fiber.resume
puts "Alive after: " + fiber.alive?.to_s

Fibers versus tråde

Vigtige forskelle:

  • Tråde planlægges af kørselssystemet; fibers planlægges af dig.
  • Tråde kan blive afbrudt når som helst; fibers skifter kun ved yield eller resume.
  • Fibers undgår kapløbstilstande, fordi kun én kører ad gangen, og skiftepunkterne er eksplicitte.

Enumeratorer bruger Fibers

Rubys dovne enumeratorer er bygget på fibers. En ekstern iterator sættes på pause mellem værdier på samme måde, som en fiber giver kontrollen tilbage.

enum = Enumerator.new do |y|
  y << 1
  y << 2
  y << 3
end

puts enum.next
puts enum.next

Fibers og asynkron I/O

Moderne Ruby indeholder et tilslutningspunkt til en fiberplanlægger. Biblioteker som async-gemmet bruger det, så når en fiber venter på I/O, genoptager planlæggeren automatisk en anden fiber.

Det giver I/O med høj samtidighed med kode, der læses som almindelig sekventiel kode.

Hvornår skal du bruge Fibers

Vælg fibers, når du har brug for:

  • Dovne generatorer, der producerer værdier efter behov.
  • Kontrolflow i koroutine-stil.
  • Finkornet, deterministisk skift uden låse.

Til de fleste almindelige samtidighedsopgaver er tråde eller async-gemmet, som bruger fibers i baggrunden, nemmere.

Hurtigt tjek

Tjek din forståelse af fibers.

Opsamling: Fibers

Du har lært kooperativ samtidighed med fibers:

  • Fiber.new sammen med resume kører og fortsætter en fiber.
  • Fiber.yield sætter fiberen på pause og giver kontrollen tilbage.
  • Værdier bevæger sig i begge retninger via argumenter til yield og resume.
  • Fibers driver enumeratorer og asynkrone I/O-planlæggere.

Dernæst: Ractors, som endelig giver dig ægte parallelisme.

Gratis at komme i gang

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 “Fibers” gratis?

Ja — alle 3 lektioner i læringssporet Ruby Academy, inklusive “Fibers”, 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 “Fibers”?

Kooperativ samtidighed 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 3 af 4.

Hvor lang tid tager lektionen “Fibers”?

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

  1. Tråde
  2. GVL forklaret
  3. Fibers
  4. Ractors
← Tilbage til Ruby Academy