Fibers
Współbieżność kooperacyjna
Fibers to bezpłatna lekcja Ruby Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Ruby Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Czym jest Fiber?
Fiber to lekka jednostka wykonania, którą kontroluje się ręcznie. W przeciwieństwie do wątków fiber nigdy nie uruchamia się samodzielnie: trzeba jawnie przekazać mu sterowanie, a on przekazuje je z powrotem.
- Nazywa się to współbieżnością kooperatywną.
- Fibery można tanio tworzyć i wstrzymywać.
- Są podstawą generatorów i asynchronicznych operacji I/O w Ruby.
Tworzenie i wznawianie
Utwórz fiber za pomocą Fiber.new, a następnie uruchom go lub kontynuuj za pomocą resume. Blok działa do momentu zakończenia lub wstrzymania.
fiber = Fiber.new do
puts "Inside the fiber"
end
fiber.resume
puts "Back in main"Wstrzymywanie za pomocą yield
Fiber.yield wstrzymuje fiber i przekazuje sterowanie temu, kto wywołał resume. Następne resume kontynuuje działanie dokładnie za wywołaniem yield.
fiber = Fiber.new do
puts "Step 1"
Fiber.yield
puts "Step 2"
end
fiber.resume
puts "Main between steps"
fiber.resumePrzekazywanie wartości na zewnątrz
Argument przekazany do Fiber.yield staje się wartością zwracaną przez resume. Dzięki temu fiber może na żądanie generować sekwencję wartości.
fiber = Fiber.new do
Fiber.yield 10
Fiber.yield 20
30
end
puts fiber.resume
puts fiber.resume
puts fiber.resumePrzekazywanie wartości do środka
Argument przekazany do resume staje się wartością zwracaną przez Fiber.yield wewnątrz fibera. Komunikacja odbywa się w obu kierunkach.
fiber = Fiber.new do
got = Fiber.yield "ready"
puts "Fiber received: " + got
end
puts fiber.resume
fiber.resume("hello")Nieskończony licznik
Ponieważ fiber można wstrzymywać i wznawiać, może on reprezentować nieskończoną leniwą sekwencję bez konieczności obliczania wszystkich jej elementów z góry.
counter = Fiber.new do
n = 1
loop do
Fiber.yield n
n += 1
end
end
3.times { puts counter.resume }Sprawdzanie, czy fiber działa
Fiber#alive? informuje, czy fiber można jeszcze wznowić. Wznowienie zakończonego fibera powoduje zgłoszenie FiberError.
fiber = Fiber.new { puts "done" }
puts "Alive before: " + fiber.alive?.to_s
fiber.resume
puts "Alive after: " + fiber.alive?.to_sFibery a wątki
Najważniejsze różnice:
- Wątki są planowane przez środowisko uruchomieniowe, a fibery są planowane przez Państwo.
- Wątki mogą zostać wywłaszczone w dowolnej chwili, a fibery przełączają się tylko przy
yieldlubresume. - Fibery unikają warunków wyścigu, ponieważ działa tylko jeden z nich, a punkty przełączania są jawne.
Enumeratory używają fiberów
Leniwe enumeratory Ruby są zbudowane na fiberach. Zewnętrzny iterator wstrzymuje się między wartościami, podobnie jak fiber podczas yield.
enum = Enumerator.new do |y|
y << 1
y << 2
y << 3
end
puts enum.next
puts enum.nextFibery i asynchroniczne operacje I/O
Nowoczesne Ruby zawiera mechanizm harmonogramu fiberów. Biblioteki takie jak gem async korzystają z niego, aby gdy jeden fiber czeka na operację I/O, harmonogram automatycznie wznowił inny fiber.
Dzięki temu można uzyskać wysoką współbieżność operacji I/O, zachowując kod wyglądający jak zwykły kod sekwencyjny.
Kiedy używać fiberów
Warto użyć fiberów, gdy potrzebne są:
- Len iwe generatory wytwarzające wartości na żądanie.
- Przepływ sterowania w stylu korutyn.
- Precyzyjne, deterministyczne przełączanie bez blokad.
W przypadku większości codziennych zastosowań współbieżności łatwiejsze będą wątki lub gem async, który wewnętrznie korzysta z fiberów.
Szybki test
Sprawdź swoją wiedzę na temat fiberów.
Podsumowanie: fibery
W tej części poznali Państwo współbieżność kooperatywną z użyciem fiberów:
Fiber.newwraz zresumeuruchamia i kontynuuje działanie fibera.Fiber.yieldwstrzymuje fiber i przekazuje sterowanie.- Wartości przepływają w obu kierunkach za pomocą argumentów yield i resume.
- Fibery stanowią podstawę enumeratorów i harmonogramów asynchronicznych operacji I/O.
Następnie: Ractory, które wreszcie zapewniają prawdziwą równoległość.
Często zadawane pytania
Czy lekcja „Fibers” jest bezpłatna?
Tak — pełny tekst „Fibers” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Ruby Academy, przejdź na CoddyKit PRO. Kurs Ruby Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Fibers”?
Współbieżność kooperacyjna Ćwiczysz Ruby Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Ruby Academy?
Nie wymagamy żadnego doświadczenia. Ruby Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Fibers”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Ruby Academy?
Tak. Każda lekcja Ruby Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.