3

Ruby 1.9 は、Ruby 1.8 (MRI) とは異なり、ネイティブ スレッドを使用します。

しかし、Ruby 1.9.3 にネイティブ スレッドの代わりにグリーン スレッドを作成するようお願いすることはできますか?

--

なぜ私はそれが欲しいのですか?

テスト目的のため。

結果を返す前に数秒間スリープする数千の同時接続を受け入れる単純なTCPサーバーを作成しようとしています。

Ruby 1.8 では、何千ものスレッドを簡単に作成できるため、同時接続数の唯一の制限は OS です。

Ruby 1.9 では、それは不可能に思えます。

このコードは、私が何を意味するかを示しています。

require 'thread'

m = Mutex.new
c = 0
ta = Array.new 10000

ta.fill do
  Thread.new do
    m.synchronize { c += 1; p "created #{c}th" if c%100 == 0; }
    sleep 15
    m.synchronize { c -= 1; p "destroyed #{c+1}th" if c%100 == 0; }
  end
end

ta.each {|t| t.join}

Ruby 1.8 では問題なく動作しますが、1.9 では非常に悲惨です。

--

残念ながら、eventmachine をいくつか試した結果、思いついadd_timerたのは Node.js サーバーでした。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  setTimeout(function() {res.end('Hello World\n');}, 10000 );
}).listen(8081, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8081/');

誰かが EventMachine で同じことを実証できれば、その答えを喜んで受け入れます。

4

1 に答える 1

6

端的に言えば、答えはノーです。1.9 のスレッド モデルはネイティブ スレッドを使用するようになり、グリーン スレッド自体は非推奨になりました。

適切な代替案を提案するために、OS 管理のスレッドではなくグリーン スレッドを使用する理由を正確に聞くことは役に立ちます。ユース ケースに応じて、たとえば、ネイティブ スレッドの軽量な代替手段として、ある種のロール ユア オウン スケジューリングまたはファイバーを備えたProcオブジェクトの使用を検討できます。スレッドの作成時間が制限要因であることがわかった場合は、スレッド/ファイバー プーリングを調べることもできます。

于 2012-10-17T06:56:25.767 に答える