Programmazione multi-threading in Ruby

Mattepuffo's logo
Programmazione multi-threading in Ruby

Programmazione multi-threading in Ruby

Utilizzare i thread in Ruby non è particolarmente difficile.

Oggi vediamo qualche esempio basico da cui partire.

Vediamo come creare due thread associati a due funzioni:

#!/usr/bin/ruby

def funzioneTest1
   i = 0
   while i <= 2
      puts "funzioneTest1: #{Time.now}"
      sleep(2)
      i = i + 1
   end
end

def funzioneTest2
   i = 0
   while i <= 2
      puts "funzioneTest2: #{Time.now}"
      sleep(2)
      i = i + 1
   end
end

puts "Start #{Time.now}"
t1 = Thread.new{funzioneTest1()}
t2 = Thread.new{funzioneTest2()}
t1.join
t2.join
t1.abort_on_exception = true
t2.abort_on_exception = true

Le ultime due righe sono facoltative.

Da quanto ho capito, solo il thread principale lancia una eccezione nel caso di interruzione.

I thread secondari no, a meno che abort_on_exception non viene impostato a true.

L'output di questo script potrebbe essere una cosa del genere:

$ ./test.rb 
Start 2017-06-05 12:01:35 +0200
funzioneTest1: 2017-06-05 12:01:35 +0200
funzioneTest2: 2017-06-05 12:01:35 +0200
funzioneTest2: 2017-06-05 12:01:37 +0200
funzioneTest1: 2017-06-05 12:01:37 +0200
funzioneTest2: 2017-06-05 12:01:39 +0200
funzioneTest1: 2017-06-05 12:01:39 +0200

Come vedete, non c'è sequenzialità nella creazione dei thread; vengono lanciati "a caso".

Un thread viene lanciato con la stessa priorità che ha il thread principale che lo lancia, e non è possibile modificarne la priorità.

Per esempi più approfonditi, come ad esempio bloccare le risorse condivise, vi consiglio di leggere questo tutorial: Ruby Multithreading.

Enjoy!


Condividi

Commentami!