为什么在线程中从rake任务运行时http请求失败?

时间:2015-03-08 16:00:17

标签: ruby multithreading rake rake-task

我想弄清楚为什么以下代码不起作用。没有打印出响应,而且其他研究请求失败。

task :test_me  do
    t1 = Thread.new do
      puts 'start'
      uri = URI.parse("http://google.com/")
      response = Net::HTTP.get_response(uri)
      puts response.inspect # this line not getting printed
    end
    # puts t1.value
end

但是,如果我运行以下

task :test_me  do
    t1 = Thread.new do
      puts 'start'
      uri = URI.parse("http://google.com/")
      response = Net::HTTP.get_response(uri)
      puts response.inspect # this line is printing because of puts below
    end
    puts t1.value
end

一切都很好

请注意,可能有很多方法可以重新构建此代码,但我尽可能地将示例缩小并从gem中提取,因此我没有太多的控制权超过它。

如果我能够找到一个可靠的原因来解释为什么这不能用于rake任务,我可能会用PR回复他们。

感谢。

1 个答案:

答案 0 :(得分:2)

发生这种情况的原因是因为您未在join阻止后调用Thread。但是,当您使用.value时,它会自动为您加入线程(如文档here所示)

试试这个:

task :test_me  do
    t1 = Thread.new do
      puts 'start'
      uri = URI.parse("http://google.com/")
      response = Net::HTTP.get_response(uri)
      puts response.inspect
    end
    t1.join
end