我在某处读到红宝石线程/纤维即使使用 1.9 也会阻塞 IO。这是真的吗?它的真正含义是什么?如果我在多个线程上执行一些 net/http 操作,那么在给定时间是否只有 1 个线程针对该请求运行?
谢谢
我在某处读到红宝石线程/纤维即使使用 1.9 也会阻塞 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,有真正的线程并且可以并行运行多个线程。
一些很好的参考:
所有线程同时运行,但 IO 将被阻塞,直到它们全部完成。
换句话说,线程并不能让你“后台”一个进程。解释器将等待所有线程完成,然后再发送更多消息。
如果您考虑一下,这很好,因为如果您的下一个进程使用线程正在修改/处理的数据,您不必怀疑它们是否完整。
如果你想后台进程结帐延迟_job