我想点击一个最终会返回所需数据的网址。有时请求超时&收到数据需要1分钟。 我想尽快做到。我正在考虑启动多线程&使用最早完成的线程中的数据。任何人都可以帮助您采用最佳方法吗?
我想我可以通过无限循环来完成它,等待线程中的数组中的结果,但这似乎是一种非常低效的方法。
答案 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/sidekiq或https://github.com/collectiveidea/delayed_job)。 根据您的具体情况,您可以使用各种技术将获得的数据推送到客户端。