0

私が持っている各タスクは、短いバーストで作業し、次に約1時間スリープしてから、仕事が完了するまで再び作業します. 一部のジョブは完了までに約 10 時間かかる場合があり、それについては何もできません。

私を悩ませているのは、ジョブが眠っている間、resque ワーカーがビジーになることです。そのため、4 つのワーカーと 5 つのジョブがある場合、最後のジョブは処理されるまで 10 時間待たなければなりません。労働者は寝ています。現在のジョブがスリープしている間に resque worker が他のジョブを処理するようにする方法はありますか?

現在、私はこれに似たワーカーを持っています:

class ImportSongs
  def self.perform(api_token, songs)
    api = API.new api_token

    songs.each_with_index do |song, i|
      # make current worker proceed with another job while it's sleeping
      sleep 60*60  if i != 0 && i % 100 == 0

      api.import_song song
    end
  end
end
4

2 に答える 2

1

resque -schedulerを使用すると、sleep ステートメントでループする単一の長時間実行ジョブの代わりに、スケジュールされた時間または遅延した時間に個別のジョブを繰り返すことができます。

于 2013-02-03T19:39:30.343 に答える
1

解決しようとしている問題は、インポート プロセスのバッチ処理による API レート制限のようです。

インポートするすべての曲を列挙するために、エンキューされるとすぐに実行される 1 つのジョブが必要です。次に、それらを 100 のグループ (または制限する必要のある任意のサイズ) に分割し、resque-scheduler を使用して 1 時間間隔で遅延ジョブをスケジュールできます。

ただし、厳しい API レート制限があり、これらの分散インポートのいくつかを同時に実行する場合、一度に流れる API トラフィックの量を制御できない場合があります。厳密なレート制限がある場合は、専用のプロセスを単一の制御ポイントとして構築し、独自のワーク キューでレート制限を適用することができます。

于 2013-02-03T18:33:58.853 に答える