Middle+
Kas yra Fiber Ruby?
sobes.tech AI
Atsakymas iš AI
Fiber Ruby kalboje yra lengvas vykdymo srautas (korutina), leidžiantis kurti kelis paralelinius vykdymo srautus viename procese / operacinės sistemos gijoje. Tai leidžia valdyti kodo vykdymo tvarką, perjungiant Fiber'us be OS planuotojo įsikišimo.
Pagrindinės Fiber savybės:
- Bendradarbiavimo planavimas: Fiber'ai nėra priverstinai atjungti OS branduolio. Perjungimas tarp jų vyksta aiškiai naudojant
resumeiryieldmetodus. - Vienas gija: Visi Fiber'ai vyksta vienoje gijoje nuosekliai, tačiau perjungimai tarp jų sukuria paralelumo iliuziją gijos viduje.
- Būsenos išsaugojimas: Fiber'as įsimena savo būseną (vietinius kintamuosius, vykdymo tašką) iškvietus
yieldir atnaujina ją iškvietusresume.
Fiber naudojimas:
- Asinchroninio kodo įgyvendinimas: modeliuojant neblokuojančias operacijas be callback'ų ar sudėtingų konstrukcijų.
- Iteratorių ir generatorių kūrimas: sudėtingų iteratorių, kurie generuoja reikšmes pagal poreikį.
- Baigiamųjų automatų apdorojimas: būsenų ir perėjimų modeliavimas aiškiai.
Naudojimo pavyzdys:
# Fiber sukūrimas
fiber = Fiber.new do
puts "Sveiki iš Fiber 1"
value1 = Fiber.yield(1) # sustabdo vykdymą, grąžina 1
puts "Gauta iš Fiber 1: #{value1}"
puts "Sveiki iš Fiber 2"
value2 = Fiber.yield(2) # sustabdo vykdymą, grąžina 2
puts "Gauta iš Fiber 2: #{value2}"
puts "Sveiki iš Fiber 3"
3 # Fiber pabaiga, grąžina 3
end
puts "Pagrindinis: prieš pirmą `resume`"
result1 = fiber.resume # atnaujina Fiber
puts "Pagrindinis: gauta iš Fiber: #{result1}"
puts "Pagrindinis: prieš antrą `resume`"
result2 = fiber.resume("iš Pagrindinio 1") # atnaujina ir perduoda reikšmę
puts "Pagrindinis: gauta iš Fiber: #{result2}"
puts "Pagrindinis: prieš trečią `resume`"
result3 = fiber.resume("iš Pagrindinio 2") # atnaujina ir perduoda reikšmę
puts "Pagrindinis: gauta iš Fiber: #{result3}"
Pagrindiniai metodai:
Fiber.new { ... }: sukuria naują Fiber. Blokas vykdomas pirmojoresumeiškvietimo metu.fiber.resume(*args): atnaujina Fiber vykdymą. Argumentai, perduotiresume, tampaFiber.yieldgrąžinama verte arba paleidžiamo bloko argumentais.Fiber.yield(*args): sustabdo šiuo metu vykstantį Fiber ir grąžina valdymą paleidžiančiam kodui (resume). Argumentai, perduotiyield, tamparesumegrąžinama verte.Fiber.current: grąžina esamą Fiber.
Fiber ir Gija skirtumai:
| Bruožas | Fiber | Gija |
|---|---|---|
| Planavimas | Bendradarbiavimas (aiškus perjungimas) | Preemptive (iš anksto numatytas, OS valdomas) |
| Ištekliai | Lengvas (mažiau išteklių) | Sunkesnis (daugiau išteklių) |
| Paralelelumas | Mock-paralelumas vienoje gijoje | Tikras paralelumas (naudojant CPU branduolius) |
| Bendravimas | Per yield ir resume |
Per bendrą atmintį, žinučių perdavimą ir kt. |
| Derinimas | Santykinai paprastesnis (vienas srautas) | Sudėtingesnis (duomenų lenktynės, užraktai) |
Fiber'ai siūlo žemesnio lygio vykdymo valdymo mechanizmą, palyginti su Gija, reikalaujantį aiškios perjungimų valdymo.