1

我正在玩 Thread,我发现我无法运行 10000 个线程。

它给了我以下错误:

        threading.rb:23:in `initialize': can't create Thread (35) (ThreadError)
        from threading.rb:23:in `new'
        from threading.rb:23:in `block in <main>'
        from threading.rb:22:in `times'
        from threading.rb:22:in `<main>'

然后我尝试查看最大数量是多少,当我组成 2046 个线程时,Ruby 将运行代码。

为什么是 2046?它似乎遵循一种记忆模式,如 512、1024、2046...

threading.rb 代码:

    threads = []
    counter = 1000

    ARGV.each do |a|
      counter = a.to_i
    end

    lines = 0

    counter.times do |i|
      puts "This is index number #{i}."
    end

    puts "You've just seen the normal printing and serial programming.\n\n"

    counter.times do |i|
      Thread.new do
        some_number = Random.rand(counter)
        sleep 1
        puts "I'm thread number #{i}. My random number is #{some_number}.\n"
        lines += 1
      end
    end

    messaged = false
    while lines < counter
      puts "\nWaiting to finish.\n" unless messaged
      print '.'
      puts "\n" if lines == counter
      messaged = true
    end

    puts "\nI've printed #{lines} lines.\n"
    puts "This is end of the program."
4

1 回答 1

1

OS X 将一个进程可以产生的线程数限制为 2046。这也适用于 Ruby。

来源&完整解释:“多少线程太多了?”

在 OSX 上,一个进程可以产生的线程数有一个硬性限制。在最近的版本中,这个限制大约是 2000 个线程。

...

如果我在 Linux 机器上运行同样的代码,我可以不眨眼地产生 10,000 个线程。因此,可以生成很多线程,但您可能不想这样做。

这是一个您可以运行以查看限制的测试程序。

1.upto(10_000) do |i|
  Thread.new { sleep }
  puts i
end
于 2013-12-15T05:32:10.207 回答