0

私が何かをすると言いましょう

arrs = Article.where(:body => nil)

arrs.count を 900 としましょう。

arrs.each do |ar|
  ar.delay.download_via_diffbot #a method that takes some time, does some http, and writes a non-nil value to ar.body
end

ここで、ログを見て、ジョブを実行する ~5 dyno で数分待ち、もう一度カウントを行います: arrs.count is now ~800

それで、900 までの仕事をするように従業員に言ったと思っていたのに、残りの 800 はどうなったのですか?

私は〜100個のHTTPリクエストしか行っていないことを確認できます.APIレポートはこれを示しています.また、ログを見るだけで、900個のジョブが発生していないことが十分にわかります.


私は Delayed::Job.count に従っていますが、最初に数百のジョブがあるにもかかわらず、そのループから約 100 しか作成されません。

このように多くの同時ジョブを間違って作成しているのでしょうか? 一度に多くのジョブを作成する適切な方法は何ですか?

4

1 に答える 1

1

Mongoid 基準は遅延ロード/評価されます。つまり、 を設定するとarticles = Article.where(body: nil)、記事が基準になります。これは、db から取得する一連のドキュメントではありません。したがって、本文のある記事を削除しnilたり、いくつかの記事の本文を埋めたりarticles.countすると、別のデータベース クエリが起動され、本文が nil である記事の数のみが報告されます。遅延したワーカーが正常にジョブを実行し、ボディ コンテンツを埋めている場合は、カウントの削減が期待されます。

PS: 質問はあまり明確ではありませんでした。私が理解している問題に答えただけです。

アップデート

遅延ジョブ数をチェックして、保留中のジョブの数をいつでも確認できますDelayed::Job.count。失敗したジョブを削除しない場合は、失敗したジョブの数を で確認できますDelayed::Job.where(:failed_at.ne => nil).count。失敗したジョブの詳細を確認するには、ジョブを調べると、ハンドラーと最後のエラーが表示されます。

于 2012-10-20T22:54:10.020 に答える