Sobes.tech
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 resume ir yield metodus.
  • 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 yield ir atnaujina ją iškvietus resume.

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 pirmojo resume iškvietimo metu.
  • fiber.resume(*args): atnaujina Fiber vykdymą. Argumentai, perduoti resume, tampa Fiber.yield grąž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, perduoti yield, tampa resume grąž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.