ruby一次可以运行的线程数量有限制吗?

ruby一次可以运行的线程数量有限制吗?,ruby,multithreading,Ruby,Multithreading,如果没有,在保持效率的同时最大值是多少 我正在创建14个线程,每个线程打开一个URL列表(大约500个),为每个线程创建一个新线程,然后下载它,并将其添加到MySQL数据库中。MySQL池大小设置为50 这是RoR中的rake任务 使用Kernal#fork或其他方法会更好吗?对于Ruby 1.8,它实际上受限于您拥有的内存量。每个进程可以创建成千上万个线程。Ruby解释器处理线程的管理,只创建一个或两个本机线程。CPU在线程之间切换不是真正的多任务处理 Ruby 1.9使用本机线程。这个限制似

如果没有,在保持效率的同时最大值是多少

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

这是RoR中的rake任务


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

对于Ruby 1.8,它实际上受限于您拥有的内存量。每个进程可以创建成千上万个线程。Ruby解释器处理线程的管理,只创建一个或两个本机线程。CPU在线程之间切换不是真正的多任务处理

Ruby 1.9使用本机线程。这个限制似乎是操作系统所允许的。只是为了测试,在操作系统不再允许之前,我可以用Ruby 1.9在mac上创建2000多个线程


请注意,一个进程有数千个线程不是一个好主意。线程调度早在这之前就成了一个负担。

好吧,因为您的线程将是IO绑定的,好消息是Ruby 1.8和1.9线程都可以实现这一点。Ruby 1.8使用“用户空间线程”,这意味着在Ruby中创建新线程时不会创建真正的新OS线程。这对CPU多任务处理不好,因为一次实际上只有一个Ruby线程在运行,但对IO多任务处理有好处。Ruby1.9使用真正的线程,这两种方法都适用

您可以创建的线程数量实际上取决于您的系统。当然有实际的限制,但你可能不想接近它们。首先,除非你下载的服务器非常慢,而且你的连接非常快,否则只有几个线程会使你的互联网连接饱和。另外,如果你从一台服务器上抓取了很多页面,那么从500个线程中一次性抛出500个请求也不会有任何好处


我会从很小的规模开始:一次运行10或20个线程。根据服务器负载、带宽等增加或减少。还存在到MySQL数据库的并发连接问题。根据表的设置方式和大小,同时尝试插入太多数据不会很好。

您可能会“毁掉”很多表!;)修好了,谢谢!没有校对标题:谢谢!也许我只使用前14个,而不是所有的子线程。谢谢你是说几乎没有限制?(是的,在1.8.6版上,有更多的线程会使你的应用程序运行得更慢,因为GC的共享引用,尽管我认为你可以使用REE来避免这些)。不,它当然不是无限的。我相信你也同意,它“实际上受到可用RAM数量的限制”。正如答案所说,我在ruby进程(os x 10.9.2,16GB Mac)中最多使用2046个线程。我最终放弃了线程,并在数据库中添加了一个索引,这使检查重复的速度加快了1000倍,因此我不再需要提高速度,就像你说的那样,我的连接过载了。谢谢我真的很喜欢能够使用每个_片批处理线程。以前也从未使用过每个_切片,因此这是一个非常有启发性的解决方案非常好的例子。谢谢,嘿,代码不错。end.each(&:join)部分做什么?我以前没有见过…group.map表示该表达式的结果是一个线程数组,然后对每个线程调用
join
方法以暂停执行并等待线程完成。否则,程序将在线程返回之前退出
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