ruby可以同时运行的线程数有限制吗?

loo*_*non 12 ruby multithreading

如果不是最大值,同时仍保持高效?

我正在创建14个线程,每个线程打开一个URL列表(大约500个),为每个线程创建一个新线程,然后下载它,并将其添加到MySQL数据库.MySQL池大小设置为50.

这是RoR中的rake任务.

这会更好地使用Kernal#fork或其他方法吗?

dar*_*mkd 13

require 'open-uri'
a = 'http://www.example.com ' * 30
arr = a.split(' ')

arr.each_slice(3) do |group|
  group.map do |site|
    Thread.new do
      open(site)
      p 'finished'
    end
  end.each(&:join)
end
Run Code Online (Sandbox Code Playgroud)


Abo*_*uby 6

好吧,由于您的线程将受到 IO 限制,所以好消息是 Ruby 1.8 和 1.9 线程都可以用于此目的。Ruby 1.8 使用“用户空间线程”,这意味着当您在 Ruby 中创建新线程时,不会创建真正的新操作系统线程。这对于 CPU 多任务处理来说是不利的,因为一次实际上只有一个 Ruby 线程在运行,但对于 IO 多任务处理来说却是好事。Ruby 1.9 使用真正的线程,并且对两者都有好处。

您可以创建的线程数量实际上取决于您的系统。当然存在实际限制,但您可能不想接近它们。首先,除非您下载的服务器非常慢并且您的连接速度非常快,否则几个线程就会使您的互联网连接饱和。另外,如果您要从单个服务器获取大量页面,那么从 500 个线程一次向其发出 500 个请求也不会产生任何好处。

我会从很小的地方开始:同时运行 10 或 20 个线程。根据服务器负载、带宽等增加或减少此值。还有 MySQL 数据库的并发连接问题。根据表的设置方式及其大小,尝试同时插入太多数据的效果不会很好。