红宝石螺纹块?

时间:2012-01-07 20:12:33

标签: ruby multithreading fiber

我读到某处,即使使用1.9,ruby线程/光纤也会阻止IO。这是真的吗?它真正意味着什么?如果我在多个线程上做一些net / http的东西,那么在给定时间内只有一个线程运行该请求吗?

感谢

2 个答案:

答案 0 :(得分:2)

假设您正在使用CRuby,一次只能运行一个线程。但是,请求将并行进行,因为每个线程在其IO未完成时将被阻塞。所以如果你做这样的事情:

require 'open-uri'
threads = 10.times.map do
  Thread.new do
    open('http://example.com').read.length
  end
end

threads.map &:join
puts threads.map &:value

它比按顺序执行要快得多。

此外,您可以检查线程是否完成而没有阻止它完成。

例如:

require 'open-uri'
thread = Thread.new do
  sleep 10
  open('http://example.com').read.length
end
puts 'still running' until thread.join(5)
puts thread.value

使用CRuby,线程无法同时运行,但它们仍然有用。其他一些实现,如JRuby,具有真正的线程,可以并行运行多个线程。

一些很好的参考资料:

答案 1 :(得分:1)

所有线程同时运行,但IO将被阻止,直到它们全部完成。

换句话说,线程不会让您能够“后台”一个进程。解释器将在发送更多消息之前等待所有线程完成。

如果您考虑一下这很好,因为如果您的下一个进程使用线程正在修改/使用的数据,您不必怀疑它们是否完整。

如果您想要后台处理结帐delayed_job