我想点击一个URL,最终将返回所需的数据。有时请求超时&接收数据最多需要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
您可能要修改此问题,以便检查响应是否成功,而不仅仅是它是非nil(例如,如果返回500错误(。
另外,我建议试图遵守API的速率限制,并及其服务条款以确保允许。
请继续介意,如果您设置了60秒的超时,则意味着任何向此EndPoinnt发送请求的人都必须等待60秒钟才能回复。这通常是不希望的,人们使用异步方法。
不确定您正在做什么以获取数据或客户端的约束是什么,但似乎您可能需要诸如背景作业之类的东西(请参阅:https://github。com/mperham/sidekiq或https://github.com/collectiveidea/delayed_job(。根据您的确切情况,您可以使用各种技术将获得的数据推向客户端。