Sobes.tech
Middle+

Fiber дар Ruby чӣ аст?

sobes.tech AI

Ҷавоб аз AI

Ruby-да Fiber — бу лоғвесрўқ ишлатиш (корутина), ки имконият медиҳад, ки бир неча параллел ишлаш тўрларини бир жараён / операцион тизими тўрида яратиш мумкин. Бу коднинг ижро тартибини бошқаришга ва ОС планировчисида иштирок этмасдан Fiber ўртасида ўтишга imkon беради.

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 га нисбатан пастроқ даражада ишлаш механизмини таклиф қилади, улар аниқ ўтишларни талаб қилади.