1

有没有一种方法可以一次从 beanstalkd 队列中保留多个作业?

我正在向外部 API 发出请求,每个查询最多可以返回 10 个结果。它们限制了我每天可以提出的请求数量,因此每个请求获得的结果越多越好。

我在文档中找不到任何提及此功能的内容,因此我正在使用此解决方法。有谁知道实现这一目标的更好方法?还是比 beanstalkd 更适合这项工作的工具?

loop do
  sleep(0.3)

  while @beanstalk.tubes[example].peek(:ready)
    jobs = []

    catch(:done) do
      10.times do |i|
        if @beanstalk.tubes[example].peek(:ready) then
          job = @beanstalk.tubes[example].reserve(0)
          jobs << job.body
          job.delete
        else
          throw(:done)
        end
      end
    end

    process(jobs)

  end
end
4

1 回答 1

4

您可以通过在删除或释放这些作业之前连续调用reserve 多次来同时保留多个作业。

根据您提供的代码示例,它可能大致如下所示:

loop do
  timeout = nil
  jobs = []

  begin
    10.times do |i|
      jobs << @beanstalk.tubes[example].reserve(timeout)
      timeout = 0
    end
  rescue Beaneater::TimedOutError
    # nothing to do
  end

  process(jobs.map{|j| j.body})

  jobs.map do |job|
    job.delete
  end
end
于 2013-01-15T04:00:59.067 回答