如何异步收集在ruby中实时创建的新线程的结果

我想继续检查数据库中的表以查找要运行的命令。 某些命令可能需要4分钟才能完成,大约10秒钟。

因此我想在线程中运行它们。 因此,每条记录都会创建新线程,并在创建线程后删除记录。

因为DB查找+线程创建将在无限循环中运行,我如何从线程获取’响应’(线程将发出shell命令并获取我想要阅读的响应代码)?

我想过创建两个带有无限循环的Thread: – 首先是DB查找+创建新线程 – 第二个是…以某种方式读取线程结果并对每个响应进行操作

或者也许我应该使用fork,或者os生成一个新进程?

您可以让每个线程将其结果推送到队列,然后您的主线程可以从队列中读取。 默认情况下,从队列中读取是一个阻塞操作,因此如果没有结果,您的代码将阻塞并等待读取。

http://ruby-doc.org/stdlib-2.0.0/libdoc/thread/rdoc/Queue.html

这是一个例子:

require 'thread' jobs = Queue.new results = Queue.new thread_pool = [] pool_size = 5 (1..pool_size).each do |i| thread_pool << Thread.new do loop do job = jobs.shift #blocks waiting for a task break if job == "!NO-MORE-JOBS!" #Otherwise, do job... puts "#{i}...." sleep rand(1..5) #Simulate the time it takes to do a job results << "thread#{i} finished #{job}" #Push some result from the job onto the Queue #Go back and get another task from the Queue end end end #All threads are now blocking waiting for a job... puts 'db_stuff' db_stuff = [ 'job1', 'job2', 'job3', 'job4', 'job5', 'job6', 'job7', ] db_stuff.each do |job| jobs << job end #Threads are now attacking the Queue like hungry dogs. pool_size.times do jobs << "!NO-MORE-JOBS!" end result_count = 0 loop do result = results.shift puts "result: #{result}" result_count +=1 break if result_count == 7 end