Ruby oferă suport nativ pentru fire de execuție de nivel de sistem (OS threads) prin clasa Thread. Deși implementarea standard CRuby (MRI) folosește un GVL (Global VM Lock) care permite doar unui singur fir să execute bytecode Ruby la un moment dat, operațiile I/O (rețea, fișiere, interogări baze de date) eliberează GVL-ul, obținând o scalabilitate masivă.
Descărcarea paralelă de date cu Thread și Thread.join
url_uri = [
"https://api.dexblog.ro/curs-valutar",
"https://api.dexblog.ro/meteo",
"https://api.dexblog.ro/stiri-tehnice"
]
fire_executie = []
url_uri.each do |url|
fire_executie << Thread.new do
# Simulăm un apel HTTP extern de rețea (care eliberează GVL):
sleep(0.5)
puts "[Thread #{Thread.current.object_id}] Descarcat: #{url}"
end
end
# Așteptăm ca toate firele să își finalizeze execuția:
fire_executie.each(&:join)
puts "Toate cererile s-au finalizat în paralel!"
Sincronizarea cu Mutex pentru prevenirea condițiilor de cursă (Race Conditions)
contor = 0
mutex = Mutex.new
fire = 10.times.map do
Thread.new do
1000.times do
# Blocul synchronize asigură că un singur fir modifică variabila 'contor':
mutex.synchronize do
contor += 1
end
end
end
end
fire.each(&:join)
puts "Valoarea finală corectă a contorului: #{contor}" # Exact 10000
Întrebări & Exemple de Cod:
Concurență și Multithreading în Ruby: Thread, Mutex și QueueAi o nelămurire despre utilizarea comenzii
Concurență și Multithreading în Ruby: Thread, Mutex și Queuesau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.