Ruby'de zorlayıcı çoklu görev nasıl uygulanır?
sobes.tech yapay zeka
AI'dan gelen yanıt
"Temiz" Ruby (MRI, JRuby, TruffleRuby) içinde, Global Interpreter Lock (GIL) nedeniyle tek bir süreçte kodun paralel yürütülmesi için gerçek preemptive çoklu görev yoktur. GIL, yalnızca bir thread'in herhangi bir zamanda Ruby kodu yürütmesine izin verir.
Ancak, Ruby'de preemptive çoklu görev, giriş-çıkış seviyesinde mevcuttur. Bir thread engelleyici giriş-çıkış işlemi gerçekleştirdiğinde (örneğin, dosya okuma, ağ isteği), GIL serbest bırakılır ve başka bir thread Ruby kodu yürütmeye devam edebilir. Bu, giriş-çıkış işlemleri için paralellik sağlar, ancak CPU-bound görevler için geçerli değildir.
Alternatif Ruby uygulamaları (örneğin, Rubinius), GIL olmadan gerçek çoklu görev uygulamaya çalıştı, ancak bunlar MRI kadar yaygın değildi.
Ruby'de CPU-bound görevlerin paralel yürütülmesi genellikle:
- Processler (
fork): Her process'in kendi GIL'i vardır, bu da Ruby kodunun paralel yürütülmesine izin verir. Processler arası veri alışverişi açık mekanizmalar (IPC) gerektirir. - Harici kütüphaneler ve C uzantıları: C'de uygulanan işlemler, GIL kontrolü dışında yürütülebilir ve paralel yürütmeyi sağlar.
Ruby 3.0'da, Fibers Scheduler tanıtıldı, bu da fiberler ve engellemeyen çağrılar kullanarak giriş-çıkış işlemlerini asenkron olarak yürütmeye imkan tanır. Bu, I/O-bound görevler için performansı artırır, ancak CPU-bound görevleri tek bir süreçte gerçek anlamda paralel hale getirmez.
# MRI'de I/O-bound görevler için thread kullanımı örneği
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 "İndirildi #{url} (Durum: #{response.code})"
end
end
threads.each(&:join)
Yani, Ruby'nin threadlerle çalışma imkanları olsa da, CPU ile ilgili görevler için gerçek preemptive çoklu görev genellikle çoklu süreçler veya GIL olmayan özel Ruby uygulamaları kullanılarak elde edilir.