ruby线程块?

ruby线程块?,ruby,multithreading,fiber,Ruby,Multithreading,Fiber,我在某个地方读到ruby线程/光纤即使使用1.9也会阻止IO。这是真的吗?它的真正含义是什么?如果我在多个线程上执行一些net/http操作,那么对于该请求,在给定的时间内是否只有一个线程在运行 谢谢所有线程同时运行,但IO将被阻止,直到它们全部完成 换句话说,线程并没有给你“后台”进程的能力。解释器将等待所有线程完成,然后再发送更多消息 如果您仔细考虑一下,这是很好的,因为如果您的下一个进程使用线程正在修改/处理的数据,您不必怀疑它们是否完成 如果您希望后台进程签出假设您使用的是CRuby,那

我在某个地方读到ruby线程/光纤即使使用1.9也会阻止IO。这是真的吗?它的真正含义是什么?如果我在多个线程上执行一些net/http操作,那么对于该请求,在给定的时间内是否只有一个线程在运行


谢谢

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

换句话说,线程并没有给你“后台”进程的能力。解释器将等待所有线程完成,然后再发送更多消息

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


如果您希望后台进程签出

假设您使用的是CRuby,那么一次只运行一个线程。但是,请求将并行进行,因为当其IO未完成时,每个线程将在其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,有真正的线程,可以并行运行多个线程

一些很好的参考资料: