2011-06-14 14 views
0

私はsftp経由でファイルをアップロードするプログラムでスレッドを使用しています。アップロードできるファイルの数は、潜在的に非常に大きくても非常に小さくてもかまいません。私は同時アップロード数が5以下になりたいと思っています。私の理解は、通常、これに使用される条件変数ですが、それは一度に1つのスレッドしか許さないように見えます。並行スレッドの制限

cv = ConditionVariable.new 

t2 = Thread.new { 
    mutex.synchronize { 
    cv.wait(mutex) 
    upload(file) 
    cv.signal 
    } 
} 

私はcvがリリースされたらそれをリリースするのを待つように指示するべきだと思います。私の質問は、数字を制限しながら、一度に1つ以上を許可するにはどうしたらいいですか?

編集:私は1回のクリックインストーラの代わりに

+0

この質問には使用しているRubyのバージョンが重要です。 –

答えて

2

使用して、ThreadPoolのをからWindows上でのRuby 1.8.7を使用しています。 Deadlock in ThreadPool(具体的には受け入れられた回答)を参照してください。

1

注意すべきことですが、JRubyを使用していない限り、Rubyには実際の並行性はありません。また、スレッド内の例外は、デバッグモードでない限り、メインループをフリーズします。

require "thread" 

POOL_SIZE = 5 

items_to_process = (0..100).to_a 

message_queue = Queue.new 

start_thread = 
    lambda do 
    Thread.new(items_to_process.shift) do |i| 
     puts "Processing #{i}" 
     message_queue.push(:done) 
    end 
    end 

items_left = items_to_process.length 

[items_left, POOL_SIZE].min.times do 
    start_thread[] 
end 

while items_left > 0 
    message_queue.pop 
    items_left -= 1 
    start_thread[] unless items_left < POOL_SIZE 
end 
+1

これは当てはまりません。 MRIのバージョン1.9.2では、GILにネイティブ/カーネルスレッドを使用しています。 JRubyやMacRubyのスレッドほど効果的ではありませんが、1.8.7には緑のスレッドではありません。 IO仕事をする場合(質問のように)1.9.2スレッドは非常に便利です(あなたが私を信じていなければTyphoeusを見てください)。 – coreyward

+0

@coreyward同意します。私は常に1.8.7 IOであっても実際には並列に行われていると考えてきました。 RubyがスケジューラをフリーズするIOシステムへのブロッキングコールを使用していると考えるのは難しいです。スレッドプールは、ソケットの使用やファイルハンドルなどを制限するために使用できます。 –

関連する問題