我有一个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线程?
答案 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