ruby 线程 block ?

标签 ruby multithreading fiber

我在某处读到,即使在 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/

相关文章:

ruby-on-rails - 使用 Rails 中的命名空间类防止 "warning: toplevel constant B referenced by A::B"

ruby - 如何获取与某个正则表达式匹配的数组中元素的位置?

python3 线程输出帮助。这是正确的输出吗?

c++ - 如何在 boost.fibers 中使用 work_stealing 调度器

ruby - 很好地格式化输出到控制台,指定选项卡的数量

ruby-on-rails - 如何访问由 update_all 生成的原始 SQL 语句(ActiveRecord 方法)

c - 具有多种消息类型的嵌入式 RTOS 生产者和消费者

java - 防止 Java 中的 JIT 重新排序

c++ - Boost.Fiber 是否会在网络请求时自动让步,例如通过网络调用数据库?

ruby - 纤维#alive?没有定义的