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!
ruby abort_on_exception thread
Commentami!