当前工作正在睡觉时,如何让resque工作人员处理其他工作?

时间:2013-02-03 11:00:56

标签: ruby background-process resque jobs task-queue

我在短时间内完成了每项任务,然后再睡一个小时然后重新工作,等等,直到工作完成。有些工作可能需要大约10个小时才能完成,我无能为力。

困扰我的是,虽然工作是睡觉,但是工作人员会很忙,所以如果我有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

2 个答案:

答案 0 :(得分:1)

您尝试解决的问题似乎是API速率限制,批量处理导入过程。

你应该有一个作业在排队后立即运行,以枚举所有要导入的歌曲。然后,您可以将它们分成100个组(或者您必须将其限制为的任何大小),并使用resque-scheduler以一小时为间隔安排延期作业。

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

答案 1 :(得分:1)

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