0

我的每项任务都在短时间内完成,然后睡大约一个小时,然后再次工作,依此类推,直到完成工作。有些工作可能需要大约 10 个小时才能完成,而我对此无能为力。

困扰我的是,当工作正在睡觉时,resque 工人会很忙,所以如果我有 4 个工人和 5 个工作,最后一个工作将不得不等待 10 个小时才能处理,这是非常不理想的,因为它可以在任何其他工作时工作工人正在睡觉。有没有办法让 resque 工作者在当前工作处于休眠状态时处理其他工作?

目前我有一个类似这样的工人:

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

看起来您要解决的问题是 API 速率限制与导入过程的批处理。

您应该有一项工作,一旦它被排队枚举所有要导入的歌曲,它就会运行。然后,您可以将它们分解为 100 个组(或您必须限制的任何大小),并使用 resque-scheduler 以一小时的间隔安排延迟作业。

但是,如果您有一个硬性 API 速率限制并且您同时执行其中几个分布式导入,您可能无法控制一次有多少 API 流量。如果您有如此严格的速率限制,您可能希望构建一个专门的流程作为单点控制,以通过它自己的工作队列强制执行速率限制。

于 2013-02-03T18:33:58.853 回答
1

使用resque-scheduler,您将能够在预定时间或延迟时间重复离散作业,以替代使用 sleep 语句循环的单个长时间运行的作业。

于 2013-02-03T19:39:30.343 回答