我有一个功能可以在页面加载之间延迟擦除网站。在函数中使用sleep会导致rails冻结,直到完成。
我应该如何在作业中的页面加载之间进行延迟?
答案 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