Sobes.tech
Middle+

Чӣ гуна иҷрои бисёркорӣ дар Ruby амалӣ мешавад?

sobes.tech AI

Ҷавоб аз AI

Дар "таза" Ruby (MRI, JRuby, TruffleRuby) воқеан ҳам пешакӣ мултимаскадро барои иҷрои ҳамзамон код дар як раванди ягона бо сабаби Global Interpreter Lock (GIL) вуҷуд надорад. GIL иҷозат медиҳад, ки танҳо як сими иҷрои Ruby кодро дар як вақт.

Аммо, пешакӣ мултимаскад дар Ruby дар сатҳи воридот/баромад вуҷуд дорад. Вақте ки як сими иҷрои амалиёти блоккунии воридот/баромадро анҷом медиҳад (масалан, хондани файл, дархости шабакавӣ), GIL озод карда мешавад, ки имкон медиҳад, ки сими дигар Ruby кодро иҷро кунад. Ин имкон медиҳад, ки параллелизм барои амалиётҳои воридот/баромад ба даст ояд, аммо барои вазифаҳои CPU-bound не.

Маҳз, татбиқҳои алтернативии Ruby (масалан, Rubinius) кӯшиш карданд, ки воқеан пешакӣ мултимаскадро бе GIL амалӣ кунанд, аммо онҳо ба таври васеъ паҳн нашуданд, ки MRI бошад.

Барои иҷрои параллелии вазифаҳои CPU-bound дар Ruby одатан истифода мешаванд:

  • Процессҳо (fork): Ҳар як раванди GIL-и худро дорад, ки иҷозат медиҳад, ки Ruby кодро параллел иҷро кунад. Табодули маълумот байни равандуҳо механизми равшанро талаб мекунад (IPC).
  • Китобхонаҳои хориҷӣ ва васеъкунии C: Операсияҳое, ки дар C амалӣ шудаанд, метавонанд дар берун аз назорати GIL иҷро шаванд, ки иҷрои параллелиро таъмин мекунанд.

Дар Ruby 3.0, Fibers Scheduler ворид шуд, ки имкон медиҳад, ки амалиётҳои воридот/баромадро ба таври асинхронӣ бо истифода аз fibers ва даъватҳои бенобаста иҷро кард. Ин ба иҷрои вазифаҳои I/O-bound беҳбудӣ меорад, аммо вазифаҳои CPU-bound воқеан ҳам дар як раванди ягона параллел намешаванд.

# Мисоли истифодаи сими дар MRI барои вазифаҳои I/O-bound
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 "Зеркашӣ шуд #{url} (Статус: #{response.code})"
  end
end

threads.each(&:join)

Аз ин рӯ, ҳарчанд Ruby дорои механизмҳо барои кор бо симиҳо аст, ҳақиқӣ пешакӣ мултимаскад барои вазифаҳои вобаста ба CPU одатан тавассути истифодаи чанд раванд ё татбиқҳои махсуси Ruby бе GIL ба даст меояд.