当线程中的 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
我想弄清楚为什么以下代码不起作用。响应未打印出来,并且从其他研究中请求失败。
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