Concurrency and Modules
Queue Worker Threads
A queue lets worker threads take jobs from a shared input without manually choosing which worker receives each job.
Queue Worker Threads
queue_worker_threads.rb
worker_count =
queue = Queue.new
completed = []
lock = Mutex.new
workers = worker_count.times.map do |worker_id|
Thread.new do
job = queue.pop
lock.synchronize do
completed << "#{worker_id}:#{job}"
end
end
end
worker_count.times do |index|
queue.push("job#{index + 1}")
end
workers.each(&:join)
puts "workers=#{worker_count}"
puts "completed=#{completed.length}"
puts "worker_entries=#{completed.sort.join(",")}"
worker_count =
queue = Queue.new
completed = []
lock = Mutex.new
workers = worker_count.times.map do |worker_id|
Thread.new do
job = queue.pop
lock.synchronize do
completed << "#{worker_id}:#{job}"
end
end
end
worker_count.times do |index|
queue.push("job#{index + 1}")
end
workers.each(&:join)
puts "workers=#{worker_count}"
puts "completed=#{completed.length}"
puts "worker_entries=#{completed.sort.join(",")}"
worker_count =
queue = Queue.new
completed = []
lock = Mutex.new
workers = worker_count.times.map do |worker_id|
Thread.new do
job = queue.pop
lock.synchronize do
completed << "#{worker_id}:#{job}"
end
end
end
worker_count.times do |index|
queue.push("job#{index + 1}")
end
workers.each(&:join)
puts "workers=#{worker_count}"
puts "completed=#{completed.length}"
puts "worker_entries=#{completed.sort.join(",")}"
queue workers
Start workers first, push one job for each worker, then join after every queued job has been claimed.