从最快的线程Ruby中返回处理过的数据

时间:2018-02-16 14:17:54

标签: ruby-on-rails ruby multithreading

我想点击一个最终会返回所需数据的网址。有时请求超时&收到数据需要1分钟。 我想尽快做到。我正在考虑启动多线程&使用最早完成的线程中的数据。任何人都可以帮助您采用最佳方法吗?

我想我可以通过无限循环来完成它,等待线程中的数组中的结果,但这似乎是一种非常低效的方法。

2 个答案:

答案 0 :(得分:1)

这样的事情可能是一种策略。它构建了一个线程列表,每个线程都尝试将result设置为某个值。然后它会一直睡到设置result并杀死所有线程(设置总共60秒的超时限制)。

require 'timeout'

proxies = "proxy.com", "proxy.org" # replace with proxies

result = nil

Timeout.timeout(60) do
  threads = proxies.map do |proxy|
    Thread.new do
      result = get(proxy, target_url) # replace with HTTP call
    end
  end
  sleep 0.25 until result
  threads.each(&:kill)
end

你可能想要修改它,以便它检查响应是否成功,而不仅仅是它是非零的(例如,如果它返回500错误)。

另外,我建议您尝试遵守API的速率限制,并检查其服务条款以确保允许这样做。

请注意,如果您将超时设置为60秒,则表示向此终端发送请求的任何人都必须等待最多60秒才能获得响应。这通常是不受欢迎的,人们会使用异步方法。

答案 1 :(得分:0)

不确定您要做什么来获取这些数据或您的客户端有哪些限制,但似乎您可能需要类似后台作业(请参阅:https://github.com/mperham/sidekiqhttps://github.com/collectiveidea/delayed_job)。 根据您的具体情况,您可以使用各种技术将获得的数据推送到客户端。