Sobes.tech
Middle+

Rubyдеги Fiber эмне?

sobes.tech AI

AIден жооп

Ruby-да Fiber — бул жеңил иштөө агымы (корутина), ал көптөгөн параллел иштөө агымдарын бир процесстин / операциялык тутумдун бир тишинде түзүүгө мүмкүндүк берет. Бул коддун аткаруу тартибин башкарууга жана ОС планировчусунун катышуусуз Fiber арасында которууга мүмкүндүк берет.

Fiberдин негизги өзгөчөлүктөрү:

  • Кооперативдүү пландоо: Fiber-лер алдын ала операциялык тутумдун ядросу тарабынан үзгүлтүккө учурабайт. Алардын ортосунда которуу resume жана yield ыкмалары аркылуу ачык-айкын жүргүзүлөт.
  • Бир тиштүү: Бардык Fiber-лер бир тиште кезектешип иштейт, бирок алардын ортосунда которуу тиштеги код үчүн параллелизм иллюзиясын түзөт.
  • Күйдүн сакталуусу: Fiber yield чакырылышында өзүнүн абалын (жергиликтүү өзгөрмөлөр, аткаруу чекити) эстейт жана resume чакырылышында кайра калыбына келтирет.

Fiberдин колдонулушу:

  • Асинхрон кодду ишке ашыруу: Блоктоочу эмес операцияларды моделдөө, callbackтер же кыйын структураларды колдонбостон.
  • Итераторлор жана генераторлор: Талапка ылайык маанилерди жараткан кыйын итераторлорду түзүү.
  • Аягына жеткен автоматтарды иштетүү: Күйдөрдү жана өтүүлөрдү ачык моделдөө.

Колдонуу мисалы:

# Fiber түзүү
fiber = Fiber.new do
  puts "Салам, Fiber 1ден"
  value1 = Fiber.yield(1) # Ишти токтотуу, 1 кайтаруу
  puts "Fiber 1ден алынган: #{value1}"

  puts "Салам, Fiber 2ден"
  value2 = Fiber.yield(2) # Ишти токтотуу, 2 кайтаруу
  puts "Fiber 2ден алынган: #{value2}"

  puts "Салам, Fiber 3ден"
  3 # Fiber аяктоо, 3 кайтаруу
end

puts "Негизги: Биринчи `resume` алдында"
result1 = fiber.resume # Fiberди калыбына келтирүү
puts "Негизги: Fiberден алынган: #{result1}"

puts "Негизги: Экинчи `resume` алдында"
result2 = fiber.resume("Негизги 1ден") # калыбына келтирүү жана маанини өткөрүү
puts "Негизги: Fiberден алынган: #{result2}"

puts "Негизги: Үчүнчү `resume` алдында"
result3 = fiber.resume("Негизги 2ден") # калыбына келтирүү жана маанини өткөрүү
puts "Негизги: Fiberден алынган: #{result3}"

Негизги ыкмалар:

  • Fiber.new { ... }: Жаңы Fiber түзөт. Блок биринчи resume чакырылышында ишке кирет.
  • fiber.resume(*args): Fiberди калыбына келтирет. resume-га өткөрүлгөн аргументтер Fiber.yield-ден кайтарылуучу маанилер же баштапкы блоктун аргументтери болот.
  • Fiber.yield(*args): Учурдагы Fiberди токтотуп, башкарууну аны иштеткен кодго кайтарат (resume). yield-га өткөрүлгөн аргументтер resume-ден кайтарылуучу маанилер болот.
  • Fiber.current: Учурдагы Fiberди кайтарат.

Fiber менен Thread ортосундагы айырмачылык:

Өзгөчөлүк Fiber Thread
Пландоо Кооперативдүү (ачык которуу) Предптив (автоматтык, ОС тарабынан башкарылат)
Ресурстар Жеңил (аз ресурстар) Көбүрөөк ресурстар)
Параллелизм Жасалма параллелизм бир тиште Чын параллелизм (CPU ядролорун колдонуу)
Байланыш yield жана resume аркылуу Жалпы эс тутум, билдирүү өткөрүү жана башка
Аралашуу Жакшыраак жеңил (сызыктуу агым) Кыйын (деректердин жарышы, блоктоолор)

Fiber-лер Thread-ке салыштырмалуу төмөнкү деңгээлдеги башкаруу механизмин камсыз кылат жана ачык которууларды талап кылат.