0

スレッドに関しては、OSXに関していくつかの制限があるようです。これをチェックしてください: http://support.apple.com/kb/HT3854

必要なだけ多くの TCP スレッドを開く責任があるシステムで ruby​​ を使用しようとしてきました。ruby で問題を再現するために、次のコードを使用しました。

10000.times { |n| p n; Thread.new { sleep  60 } }

上記のコードを実行すると、約 2022 スレッドを出力した後もこのエラーが発生し続けます。

ThreadError: unable to create new native thread
  initialize at org/jruby/RubyThread.java:382
         new at org/jruby/RubyThread.java:301
      (root) at main.rb:1
       times at org/jruby/RubyFixnum.java:273
      (root) at main.rb:1

それは Jruby の実装ですが、他のすべての実装でも同じです。実際には、cpp で同じことを行うと同じ問題に直面するように、Ruby 自体には関係ありません。

#include <pthread.h>
#include <stdio.h>
#include <ulimit.h>

void thread_main(void *ptr)
{
  sleep(60);
}

int main()
{
  int i;
  pthread_t threads[10000];

  for(i = 0; i < 10000; i++) {
    printf("%d\n", i);
    if(pthread_create(threads + i, NULL, (void *)thread_main, NULL) != 0) {
      perror("thread test");
      exit(1);
    }
  }
}

そこにあるすべてのリソースを使用するためにスレッドの数を最大化する方法はありますか?

4

1 に答える 1

3

そこにあるすべてのリソースを使用するためにスレッドの数を最大化する方法はありますか?

デザインを変更します。10000 個の物理スレッドはリソースを浪費しているだけです。大量のメモリを消費し、(ほとんど) すべての時間をコンテキスト切り替えに費やします。

プログラムを (開始点として) 16 スレッドに制限し、別の方法で問題に取り組みます。あなたのプログラムは、この方法ではるかに多くの CPU 時間を受け取ります (読んでください: 1000 以上のスレッドを使用するよりも何倍も高速になります)。(OPに示されているように)問題にさらにスレッドを投げると、システムがクロールするのが遅くなります(リクエストを尊重する場合-Parallel Slowdownを参照)。

OS X の「スレッド コスト」も参照してください。

于 2012-11-11T22:09:33.250 に答える