在SidekiqStatus容器中动态加载新作业以监视完成情况

时间:2014-08-20 12:58:02

标签: ruby background-process sidekiq

我构建了一个在两个Sidekiq工作器中实现的小型Web爬虫:Crawler和Parsing。 Crawler工作人员将寻找链接,而Parsing worker将读取页面正文。

我希望在所有页面的抓取/解析完成后触发警报。仅监视Crawler作业不是最佳解决方案,因为它可能已完成但可能有几个Parser作业正在运行。

看看sidekiq-status gem似乎我无法动态地将新作业添加到容器中进行监视。例如。有一个"添加"会很高兴。方法如下:

@container = SidekiqStatus::Container.new

# ... for each page url found:

jid = ParserWorker.perform_async(page_url)

@container.add(jid)

最接近这个是使用" SidekiqStatus :: Container.load"或者" SidekiqStatus :: Container.load_multi"但是,不可能在后验容器中添加新的作业。

一个解决方案是创建尽可能多的SidekiqStatus :: Container实例作为ParserJobs的数量,并检查它们是否都具有status ==" finished",但我想知道是否存在更优雅的解决方案这些工具。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您正在准确描述Sidekiq Pro的批量功能。你可以花很多时间或一些钱来解决你的问题。

https://github.com/mperham/sidekiq/wiki/Batches

答案 1 :(得分:0)

好的,这是一个简单的解决方案。使用sidekiq-status gem,Crawler工作程序会跟踪Parser作业的作业ID,并在任何Parser作业仍然繁忙时停止(使用SidekiqStatus :: Container实例检查作业状态)。

def perform()
  # for each page....
    @jids << ParserWorker.perform_async(page_url)
  # end

  # crawler finished, parsers may still be running
  while parsers_busy?
    sleep 5 # wait 5 secs between each check
  end

  # all parsers complete, trigger notification...

end

def parsers_busy?
  status_containers = SidekiqStatus::Container.load_multi(@jids)

  for container in status_containers
    if container.status == 'waiting' || container.status == 'working'
      return true
    end
  end

  return false
end