我在某处读到,即使在 1.9 版本中,ruby 线程/光纤也会阻塞 IO。这是真的吗?它的真正含义是什么?如果我在多个线程上执行一些 net/http 操作,则在给定时间只有 1 个线程针对该请求运行?
谢谢
最佳答案
假设您使用 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)具有真正的线程,并且可以并行运行多个线程。
一些很好的引用:
关于 ruby 线程 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8772721/