在红宝石或犹豫中处理线

时间:2012-01-10 05:59:56

标签: ruby jruby

我有一个rabbitmq队列订阅者,每次使用新消息时都会旋转一个新线程:

AMQP.start(@conf) do |connection|
  channel = AMQP::Channel.new(connection)

  requests_queue = channel.queue("one")

  requests_queue.subscribe(:ack => true) do |header, body|
    puts "we have a message at #{Time.now} and n is #{n}"

    url_search = MultiJson.decode(body)

    Thread.new do
      5.times do
        lead = get_lead(n, (n == 5))

        puts "message #{n} is_last = #{lead.is_last} at #{Time.now}";

        AMQP::Exchange.default.publish(
                                        MultiJson.encode(lead), 
                                        :routing_key => header.reply_to,
                                        :correlation_id => header.correlation_id
                                      )

        n += 1
        sleep(2)
      end
    end
  end
end

我的问题是,在处理邮件后如何处理线程?我应该使用线程池吗?

我正在使用JRuby。上面的代码是使用普通的ruby语法在幕后创建Java JVM线程还是应该显式创建Java线程?

1 个答案:

答案 0 :(得分:1)

你不必手动处理我认为的线程,你应该使用ruby线程,从我收集它们是jruby中的java线程,这是jruby得到它的好表现。

常见的做法是启动几个线程,然后在继续之前加入所有线程,如果你想确保在下一步之前完成所有线程,但这里似乎并不需要。

这是一个小测试程序:

# foo.rb
a = Thread.new { print "a"; sleep(1); print "b"; print "c" }
require 'pp'
pp Thread.list
puts "foo"
sleep(2); 
pp Thread.list
puts "bar"

如您所见,自动删除了衍生的后台线程。 (测试为jruby以及1.9.2

$ ruby foo.rb 
a[#<Thread:0x00000100887678 run>, #<Thread:0x0000010086c7d8 sleep>]
foo
bc[#<Thread:0x00000100887678 run>]
bar