带有睡眠功能的Rails ActiveJob

时间:2018-03-28 09:44:44

标签: ruby-on-rails

我有一个功能可以在页面加载之间延迟擦除网站。在函数中使用sleep会导致rails冻结,直到完成。

我应该如何在作业中的页面加载之间进行延迟?

1 个答案:

答案 0 :(得分:0)

在开发过程中,您将运行一个进程,因此当您开始执行搜索过程时,系统进程将被占用,并且无法响应任何其他请求。即阻止

为了使您的工作更加正常,请使用异步ActiveJob后端在单独的进程中运行抓取任务(如Sergio建议的那样)。除非你有理由,否则可能会选择DelayedJob,因为它使用Active Record数据库(你可能已经在使用它),或者对于开发中的初学者使用内置的异步适配器。

class ScrapeJob < ApplicationJob
  self.queue_adapter = :async

  def perform(url)
    # do scraping
  end
end

ScrapeJob.perform_later(url)

http://edgeapi.rubyonrails.org/classes/ActiveJob/QueueAdapters.html

此外,考虑到您的延迟时间,您可以创建一个比前一个请求的响应时间长10倍的延迟。或至少1秒,以较大者为准。

require 'benchmark'

urls.each do |url|
  time = Benchmark.measure do
    # scrape page
  end

  sleep(time.realtime * 10)
end