ruby - 具有固定限制的并行 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)
在上面的例子中,每个线程在同一行用自己的状态覆盖输出,这意味着我只在一行中看到更改的名称和百分比。简而言之,我该如何处理这个问题?
解决方案
推荐阅读
- python - 通过管理面板上传文件后,我可以告诉 Django 运行某些功能吗?
- r - 如何添加具有行中值的列名的列?
- ubuntu - 在 WSL 中通过 xdg-open 打开 Windows 原生 exe 程序
- java - 如何使用 Sheets API 插入评论
- c++ - Windows 10 上的 CppFlow
- file - struts2如何下载保存的文件
- javascript - JavaScript - 在没有 UTC 偏移的情况下获取用户本地时间
- c# - 无法在 VB.net 子文件夹中维护会话
- javascript - 无法从 Chrome 扩展向 REST API 发送 POST 请求
- java - 调用 entityManager.flush - 调用它两次、一次或根本不调用它的效果