5

こんにちは
私はrails-websiteをセットアップします。そこでは、最初のユーザー入力の後、いくつかの重い計算が行われます(c-extension to ruby​​を介して、マルチスレッドを使用します)。これらの計算はほぼすべてのCPU時間(メモリも)を消費するため、一度に複数の計算を実行することはできません。また、レールはその計算の結果を表示する必要があり、サイトはjavascriptなしで動作するはずなので、(非同期の)バックグラウンドジョブ(遅延ジョブのように)を使用することはできません。
したがって、すべてのRailsインスタンスが計算要求をキューに入れ、応答を待つ必要がある別のプロセスが必要だと思います(キューがいっぱいの場合はエラーメッセージかもしれません)、一種の同期ジョブマネージャーです。

そのような機能を備えたgem/プラグインがあるかどうか誰かが知っていますか?(naniteは私にはかなりクールに見えましたが、非同期であるように見えるので、railsインスタンスは計算がいつ終了するかわかりません。それは正しいですか?)
別のアイデアは、分散ルビー(drb)を使用して自分で書くことですが、なぜ発明するのですか?それがすでに存在する場合、再びホイール?

どんな助けもいただければ幸いです!

編集:zaiusのヒントのおかげで、これは非同期で実行できると思うので、resqueを試してみます。

4

2 に答える 2

5

Ruby にはミューテックス / セマフォがあります。

セマフォを使用して、リソースを大量に消費するプロセスが同時に 1 つだけ発生するようにすることができます。

ただし、他のタスクが終了している間にフロントエンド プロセスをブロックするという考えは、私には正しくないように思えます。これを行う場合は、バックグラウンド ワーカーを使用し、refresh メタ タグを含むページ (または iframe) を使用して進行状況を継続的にチェックします。

そうすれば、JavaScript が有効なクライアントと無効なクライアントの両方に同じコードを使用できます。また、Web アプリのスレッドがブロックされていません。

于 2011-01-13T09:34:39.043 に答える
1

別のプロセスがある場合は、バックグラウンド ジョブがあるため、それを使用できるかできないかのどちらかです...

私がやったことは、ウェブサイトにリクエストパラメータをデータベースに書き込むことです。次に、デーモンgemを使用して、別のプロセスがデータベース内の保留中のリクエストを探します。作業を行い、結果をデータベースに書き戻します。

Web サイトは、結果が準備できるまでデータベースをポーリングし、結果を表示します。

私はJavaScriptを使用してポーリングを行いますが。

本当に JavaScript を使用できない場合は、Web 要求スレッドで作業を行うか、バックグラウンド スレッドが終了するまでそのスレッドを待機させる必要があるようです。

Web 要求スレッドを待機させるには、ループを実行して、応答が保存されるまでデータベースをチェックします。そこに到達したら、スレッドを完了することができます。

HTH、クリス

于 2011-01-13T07:27:56.170 に答える