我在短时间内完成了每项任务,然后再睡一个小时然后重新工作,等等,直到工作完成。有些工作可能需要大约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
答案 0 :(得分:1)
您尝试解决的问题似乎是API速率限制,批量处理导入过程。
你应该有一个作业在排队后立即运行,以枚举所有要导入的歌曲。然后,您可以将它们分成100个组(或者您必须将其限制为的任何大小),并使用resque-scheduler以一小时为间隔安排延期作业。
但是,如果您有一个硬API速率限制并且同时执行其中几个分布式导入,则可能无法一次控制多少API流量。如果您有严格的速率限制,您可能希望构建一个专门的流程作为单一控制点,以通过它自己的工作队列强制执行速率限制。
答案 1 :(得分:1)
使用resque-scheduler,您将能够在计划或延迟时间重复离散作业,作为循环使用sleep语句的单个长时间运行作业的替代。