【问题标题】:Disposing of a thread in ruby or jruby在 ruby​​ 或 jruby 中处理线程
【发布时间】:2012-02-06 14:56:45
【问题描述】:

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

【问题讨论】:

    标签: ruby jruby


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 2012-02-24
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2011-06-21
      • 1970-01-01
      相关资源
      最近更新 更多