首页 > 解决方案 > 具有固定限制的并行 HTTP 请求的正确输出

问题描述

我正在努力在 Ruby 中实现并行 HTTP 请求。

我需要并行而不是顺序执行 HTTP 请求。我成功地模拟了第一次迭代,然而,在 Ruby 中编排并行性时,我遇到了两个主要问题。

第一个问题是限制并行请求的数量。我尝试通过对包含 URL 的源数组进行切片来发出请求,如下所示。我会说它有效,但我仍然不确定这是否是最好的方法。

urls = ['https://example.com']
limit = 3

threads = []
urls.each_slice(limit) do |slice|
  threads << Thread.new(slice) do |t|
    t.each { |url| make_request(url) }
  end
end
threads.each(&:join)

第二个问题是在线程体内使用回车。我的主要目标是使信息消息正确且用户友好。为此,我决定使用回车符向最终用户显示更多信息性消息,例如下载百分比。我希望下面的代码在理论上可以完美运行,但每个线程在实践中都出人意料地占用了另一个空间。我的意思是在运行时有一个竞争条件。

urls = ['https://example.com']
limit = 3

threads = []
urls.each_slice(limit) do |slice|
  threads << Thread.new(slice) do |t|
    t.each do |url|
      print "\rDownloading #{url}... #{percentage}%" # percentage technically implemented in make_request. I just wanted to emphasise what I mean here.
      make_request(url) }
    end
  end
end
threads.each(&:join)

在上面的例子中,每个线程在同一行用自己的状态覆盖输出,这意味着我只在一行中看到更改的名称和百分比。简而言之,我该如何处理这个问题?

标签: rubymultithreadingconcurrencycarriage-return

解决方案


推荐阅读