コマンドラインツールであるPhantomJSを使用して、Webサイトの画像をレンダリングしています。これらを次々に実行するのではなく、並行して実行したいと考えています。これどうやってするの?
3 に答える
Resqueを使用した例を次に示します。簡潔にするためにエスケープを残したことに注意してください...外部入力をシェルコマンドに直接渡すべきではありません。
class RasterizeWebPageJob
@queue = :screenshots
def self.perform(url)
system("/usr/bin/env DISPLAY=:1 phantomjs rasterize.js #{url} ...")
end
end
10.times { Resque.enqueue(RasterizeWebPageJob, "http://google.com/") }
十分な数のワーカーを実行している (そして使用可能なワーカーがある) 場合、それらは並列で実行されます。ここで重要なことは、1 つのジョブ内から複数のスクリーンショットを処理するのではなく、個別のジョブをキューに入れることです。
Thread.new
Railsコントローラーで使用しないことをお勧めします。キューは、スレッドよりも管理がはるかに簡単 (かつ安全) です。
それを行うには複数の方法があります。あなたが探しているのは、バックグラウンドで非同期ジョブを実行することです。このビデオは役立つかもしれません:http://railscasts.com/episodes/128-starling-and-workling
これらの他の答えが欠けている可能性があるのは、使用したいデザインパターンに関する基本的な教育を提供することだと思います. はい、Resque または Starling と Workling または Resque と Foreman の組み合わせは優れたソリューションですが、おそらくその理由を知りたいと思うでしょう。
使用したいパターンは、Observer Pattern、Publisher-Subscriber、または PubSub の略だと思います。この考え方は、最も単純なケースでは、プリンターがどのように機能するかに似ています。
人 (発行者) は、たとえば Web ブラウザーで印刷をクリックします。次に、非同期的に、プリンターがそれらを印刷します。プリンタがオンになっていない場合は、オンになったときにメッセージを取得します。複数の人が文書をプリンターに送信すると、プリンターは文書を順番に選択し (FIFO)、処理 (印刷) します。複数のプリンターが同じキューをリッスンしている場合 (通常は存在しないため、メタファーが崩壊する場所です)、順番にメッセージを選択して、キューをより高速に処理できます。
Resque およびその他の PubSub gem、プロジェクト、JAR (Ruby に限定されません) は、この設計パターンを実装します。
パターンの詳細については、こちらをご覧ください (Java Observable は設計上不適切なクラスであることに注意してください。独自のものを実装できます)。
http://ruby-doc.org/stdlib-2.0/libdoc/observer/rdoc/Observable.html http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html http: //en.wikipedia.org/wiki/Observer_pattern http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern
私たちの処理では、小規模なタスクには Resque を使用しますが、それでもグローバル インタープリター ロックや、サーバーへのコードのデプロイ、gem のインストールなどのその他の問題に限定されます。現在、Storm ( https://github. com/nathanmarz/storm ) を使用してストリーム処理を処理すると、はるかにうまく機能します。1 日に処理する画像の数によっては、Storm はやりたいことに対してやり過ぎかもしれません。