我构建了一个在两个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",但我想知道是否存在更优雅的解决方案这些工具。
感谢任何帮助。
答案 0 :(得分:1)
您正在准确描述Sidekiq Pro的批量功能。你可以花很多时间或一些钱来解决你的问题。
答案 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