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