Multithreading is nothing new in Ruby but its only in recent times that I’ve
found a use for it.
Unlike background processes which runs your task on its own instance
independently from the main rails app, Multithreading also runs each threads
separately but needs to join back with the main thread in order to continue.
An example use:
@groups.each do |t| threads << Thread.new do t.process_something end end # Group def process_something # calls external resources and wait for a reply. end
In the old days, if I were to not use multithreading it will be just:
@groups.each do |t| t.process_something end
And if one of the group’s “process_something” has a blocking IO, the other
groups down the iterative line may never get called.
But something’s missing. You said that all threads have to rejoin their main
thread but the first example doesn’t show and rejoin. How do I do that?
# Without Threadwait @groups.each do |t| .. end threads.each(&:join) # use ThreadWait require 'thread' require 'thwait' @group.each do |t| .. end ThreadsWait.all_waits(*threads)
Threadwait? Threadwait waits for every thread specified to complete before continuing down the main thread line.
Without threadwait, what happens is that when the threads gets forked,
asynchronously your main thread (the one doing the forking) reaches its end of
file and if the forked threads haven’t been completed since, it will just kill
Whereas with ThreadWait, it monitors all the threads and only continue down the
file after all Threads have been completed and joined. This ensures that your
forked thread always runs into completion.
How do I manage ruby threads so that they finish all their