Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从最快的线程返回已处理的数据_Ruby On Rails_Ruby_Multithreading - Fatal编程技术网

Ruby on rails 从最快的线程返回已处理的数据

Ruby on rails 从最快的线程返回已处理的数据,ruby-on-rails,ruby,multithreading,Ruby On Rails,Ruby,Multithreading,我想点击一个URL,它最终将返回所需的数据。有时请求超时&接收数据最多需要1分钟。 我想让它尽可能快。我正在考虑启动多个线程&使用最早完成的线程中的数据。谁能帮我找到最好的方法 我想我可以通过无限循环等待线程数组中的结果来完成这项工作,但这似乎是一种效率非常低的方式。不确定您要做什么来获取数据,或者您的客户端有什么限制,但您可能需要一些后台工作(请参阅:或)。 根据具体情况,您可以使用各种技术将获得的数据推送到客户机。类似的方法可能是一种策略。它构建了一个线程列表,每个线程都试图将结果设置为某个

我想点击一个URL,它最终将返回所需的数据。有时请求超时&接收数据最多需要1分钟。 我想让它尽可能快。我正在考虑启动多个线程&使用最早完成的线程中的数据。谁能帮我找到最好的方法


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

不确定您要做什么来获取数据,或者您的客户端有什么限制,但您可能需要一些后台工作(请参阅:或)。
根据具体情况,您可以使用各种技术将获得的数据推送到客户机。

类似的方法可能是一种策略。它构建了一个线程列表,每个线程都试图将
结果设置为某个值。然后它一直休眠,直到设置了
result
,并终止所有线程(设置总的60秒超时限制)

您可能希望修改它,以便它检查响应是否成功,而不仅仅是它是否为非nil(例如,如果它返回500个错误)

此外,我建议尽量遵守API的费率限制,并与他们的服务条款核实以确保这是允许的


请记住,如果您将超时设置为60秒,这意味着任何向此端点发送请求的人都必须等待60秒才能得到响应。这通常是不可取的,人们使用异步方法代替

你想一次又一次地提出同样的要求,直到有人回来?这样做很可能会让事情变得更糟。这听起来是一个很棒的网站DOS方式。。。服务器响应时间越长,收到的请求就越多!您是否控制此服务器?您可以使用多种技术来改进实现。@TomLord否,我无法控制目标站点的服务器。该网站非常有名&他们可以轻松处理请求。问题是他们认为我是一个机器人(这是真的:P),并阻止请求。我想用不同的代理并行运行X(即4或8)个线程,并等待结果。一旦我从最早的线程收到成功的结果,就返回结果。你能帮我把这个想法翻译成代码吗?解决这个问题的另一种方法是在最终用户点击该URL时启动一个worker,然后显示该用户的worker列表(或者给他刚启动的worker的ID)。使用该列表(及其状态),最终用户可以在工作人员完成其工作后访问所获取的数据
Resque
非常好,因为我需要实时返回结果,而不是异步返回。没关系。请参阅@MrYoshiji的评论
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