1

スレッドで遊んでいて、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では、1つのプロセスが生成できるスレッドの数に厳しい制限があります。最近のバージョンでは、その制限は約2000スレッドです。

..。

Linuxマシンでこれと同じコードを実行すると、点滅せずに10,000スレッドを生成できます。したがって、多くのスレッドを生成することは可能ですが、おそらくそうしたくないでしょう。

制限を確認するために実行できるテストプログラムは次のとおりです。

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