当线程中的 rake 任务 运行 时,为什么 http 请求会失败?

Why does http request fail when running from rake task in a thread?

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

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 返回给他们。

谢谢。

发生这种情况的原因是您没有在 Thread 块之后调用 join。但是,当您使用 .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