Sobes.tech
Middle+

Ruby'da majburan ko'p vazifali boshqaruv qanday amalga oshiriladi?

sobes.tech AI

AIdan javob

"Toza" Ruby (MRI, JRuby, TruffleRuby) daqiqada, bir jarayon ichida kodning parallel bajarilishi uchun haqiqiy preemptive multitasking mavjud emas, chunki Global Interpreter Lock (GIL) mavjud. GIL faqat bitta ipga Ruby kodini bajarishga ruxsat beradi.

Ammo, Ruby'da preemptive multitasking kirish-chiqish darajasida mavjud. Bir ip bloklovchi kirish-chiqish operatsiyasini bajarayotganda (masalan, fayl o'qish, tarmoq so'rovi), GIL bo'shatiladi, bu esa boshqa ipga Ruby kodini bajarishga imkon beradi. Bu kirish-chiqish operatsiyalari uchun parallelizmni ta'minlaydi, ammo CPU-ga bog'liq vazifalar uchun emas.

Alternativ Ruby implementatsiyalari (masalan, Rubinius) GILsiz haqiqiy multitaskingni amalga oshirishga harakat qilishdi, ammo ular MRI kabi keng tarqalmadi.

Ruby'da CPU-ga bog'liq vazifalarni parallel bajarish uchun odatda:

  • Jarayonlar (fork): Har bir jarayon o'z GILga ega, bu esa Ruby kodini parallel bajarishga imkon beradi. Jarayonlar o'rtasida ma'lumot almashish aniq mexanizmlar (IPC) talab qiladi.
  • Tashqi kutubxonalar va C kengaytmalari: Cda amalga oshirilgan operatsiyalar GIL nazorati tashqarisida bajarilishi mumkin va parallel bajarishni ta'minlaydi.

Ruby 3.0 da Fibers Scheduler kiritildi, bu asinxron kirish-chiqish operatsiyalarini fiberlar va bloklamaydigan chaqiruvlar yordamida bajarishga imkon beradi. Bu I/O-ga bog'liq vazifalar uchun ishlashni yaxshilaydi, ammo CPU-ga bog'liq vazifalarni haqiqatan ham parallel qilish uchun emas.

# MRI'da I/O-ga bog'liq vazifalar uchun iplar misoli
require 'net/http'
require 'uri'

urls = %w[http://example.com http://ruby-lang.org]
threads = urls.map do |url|
  Thread.new do
    uri = URI.parse(url)
    response = Net::HTTP.get_response(uri)
    puts "Yuklab olindi #{url} (Status: #{response.code})"
  end
end

threads.each(&:join)

Shunday qilib, Ruby'da ip bilan ishlash imkoniyatlari bo'lsa-da, CPU bilan bog'liq vazifalar uchun haqiqiy preemptive multitasking odatda ko'p jarayonlar yoki GILsiz maxsus Ruby implementatsiyalari yordamida amalga oshiriladi.