Middle+
Ruby'da Fiber nima?
sobes.tech AI
AIdan javob
Ruby'da Fiber, operatsion tizimining bitta jarayon / ipni ichida bir nechta parallel bajariladigan oqimlarni yaratishga imkon beradigan yengil vaznli bajarilish oqimi (koreografi) hisoblanadi. Bu kodning bajarilish tartibini boshqarishga imkon beradi va Fiberlar orasida OS rejalashtiruvchisiga aralashmasdan o'tishni ta'minlaydi.
Fiberning asosiy xususiyatlari:
- Hamkorlikda rejalashtirish: Fiberlar OS yadrosi tomonidan oldindan to'xtatilmaydi. Ular orasidagi o'tish
resumevayieldmetodlari yordamida aniq amalga oshiriladi. - Yagona ip: Barcha Fiberlar bir ipda ketma-ket bajariladi, ammo ular orasidagi o'tish ip ichidagi kod uchun parallelizm illyuziyasini yaratadi.
- Holatni saqlash: Fiber
yieldchaqirilganda o'z holatini (mahalliy o'zgaruvchilar, bajarilish nuqtasi) eslaydi varesumechaqirilganda davom ettiradi.
Fiberning qo'llanilishi:
- Asinxron kodni amalga oshirish: CallBacklar yoki murakkab tuzilmalar ishlatmasdan bloklamaydigan operatsiyalarni modellash.
- Iteratsiya va generatorlar: Talabga binoan qiymatlarni ishlab chiqaradigan murakkab iteratorlar yaratish.
- Yakuniy avtomatlar bilan ishlash: Holatlarni va o'tishlarni aniq modellash.
Misol:
# Fiber yaratish
fiber = Fiber.new do
puts "Fiber 1 dan salom"
value1 = Fiber.yield(1) # Bajarishni to'xtatadi, 1 ni qaytaradi
puts "Fiber 1 dan qabul qilindi: #{value1}"
puts "Fiber 2 dan salom"
value2 = Fiber.yield(2) # Bajarishni to'xtatadi, 2 ni qaytaradi
puts "Fiber 2 dan qabul qilindi: #{value2}"
puts "Fiber 3 dan salom"
3 # Fiberni yakunlaydi, 3 ni qaytaradi
end
puts "Asosiy: Birinchi resume'dan oldin"
result1 = fiber.resume # Fiberni davom ettirish
puts "Asosiy: Fiberdan olingan: #{result1}"
puts "Asosiy: Ikkinchi resume'dan oldin"
result2 = fiber.resume("Main 1 dan") # Davom ettirish va qiymat yuborish
puts "Asosiy: Fiberdan olingan: #{result2}"
puts "Asosiy: Uchinchi resume'dan oldin"
result3 = fiber.resume("Main 2 dan") # Davom ettirish va qiymat yuborish
puts "Asosiy: Fiberdan olingan: #{result3}"
Asosiy metodlar:
Fiber.new { ... }: Yangi Fiber yaratadi. Kod bloki birinchiresumechaqirilganda bajariladi.fiber.resume(*args): Fiberni davom ettiradi.resumega yuborilgan argumentlarFiber.yieldning qaytish qiymati yoki boshlovchi blok argumentlari bo'ladi.Fiber.yield(*args): Joriy Fiberni to'xtatadi va boshqarishni uni ishga tushirgan kodga qaytaradi (resume).yieldga yuborilgan argumentlarresumening qaytish qiymati bo'ladi.Fiber.current: Joriy Fiberni qaytaradi.
Fiber va Thread o'rtasidagi farqlar:
| Xususiyat | Fiber | Thread |
|---|---|---|
| Rejalashtirish | Hamkorlikda (aniq o'tish) | Oldindan to'xtatiladigan (OS tomonidan boshqariladi) |
| Resurslar | Yengil (kam resurslar) | Og'ir (ko'proq resurslar) |
| Parallelizm | Yolg'on parallelizm bitta ipda | Haqiqiy parallelizm (CPU yadro ishlatadi) |
| Muloqot | yield va resume orqali |
Umumiy xotira, xabarlar va boshqalar orqali |
| Debug qilish | Nisbatan oddiy (satr oqimi) | Murakkab (yugurish, blokirovkalar) |
Fiberlar, Thread bilan solishtirganda, pastroq darajadagi bajarish nazorat mexanizmini taqdim etadi, ammo aniq boshqarishni talab qiladi.