IO のブロックを回避するために Ruby ファイバーを使用する方法
概要
ディレクトリ内の大量のファイルを S3 にアップロードする必要があります。アップロードに必要な時間の 90% 以上は http リクエストが完了するのを待つのに費やされるため、何らかの方法で複数のリクエストを一度に実行したいと考えています。
ファイバーはこれに関して私を助けることができますか?これらはこの種の問題を解決する方法として説明されていますが、http 呼び出しがブロックされている間に作業を行う方法が思いつきません。
スレッドを使わずにこの問題を解決する方法はありますか?
解決策
1.9 のファイバーについては詳しくありませんが、1.8.6 の通常のスレッドでこの問題は解決できます。キュー http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html を使用してみてください
ドキュメントの例を見ると、コンシューマーがアップロードを行う部分です。 URL とファイルを「消費」し、データをアップロードします。プロデューサーは、動作を継続し、アップロードする新しいファイルを検索するプログラムの一部です。
複数のファイルを一度にアップロードしたい場合は、ファイルごとに新しいスレッドを起動します。
t = Thread.new do
upload_file(param1, param2)
end
@all_threads << t
次に、「プロデューサー」コードの後半で次のようにします (これは独自のスレッド内にある必要はなく、メイン プログラムでもかまいません)。
@all_threads.each do |t|
t.join if t.alive?
end
キューは @member_variable または のいずれかになります。