【问题标题】:Retrieve information from a REST service asynchronously while throttling the number of requests在限制请求数量的同时从 REST 服务异步检索信息
【发布时间】:2013-03-18 17:29:14
【问题描述】:

我有一个程序需要从 Atom 提要中获取一些数据。我尝试了两种方法,但都没有奏效。

我已经使用WebClient同步下载了我需要的所有帖子,但是有几千个,而且服务很慢,需要好几个小时。

我尝试过(第一次)async/await、新的 HttpClient 和 Task.WhenAll。不幸的是,这会导致成千上万的请求访问服务并将其关闭。

如何并行运行 100 个请求?

【问题讨论】:

  • 您是否尝试过使用带有 BeginGetResponse 的 AsyncCallback 的 HttpWebRequest?
  • 这对我有什么帮助?
  • 从你的问题来看,我以为你想进行异步调用?还是您认为这种技术(由 Google 推荐)也会使服务不堪重负?
  • 这是第三方提要还是您的提要?如果是第三方,您可能会查看他们的服务,因为他们很可能有一项服务,您可以请求返回特定计数,并可能请求偏移量以创建“分页”类型的功能。

标签: c# .net async-await


【解决方案1】:

您可以将 Parellel 与 ParallelOptions.MaxDegreeOfParallelism 一起使用

ParallelOptions.MaxDegreeOfParallelism Property

或者一个有界集合大小的 BlockingCollection

BlockingCollection Overview

我会推荐 BlockingCollection

【讨论】:

  • 谢谢布拉姆。 ParallelOptions.MaxDegreeOfParallelism 工作正常。在我的情况下,它似乎比 async/await 和 HttpClient.GetAsync 慢 4 倍。与单个 IO 完成端口线程相比,我猜线程之间的切换成本很高。
  • 试试 BlockingCollection。但这可能不会更好。不太确定它如何处理线程。对我来说,我喜欢这种语法。
【解决方案2】:

听起来您已经有了一个可以一次完成很多工作的解决方案。我建议只在上面添加另一层,它只是循环遍历所有帖子,但一次只处理 100 个。

现在您可能有: DownloadAll(List ListofPosts) 在 DownloadAll 中,您最后可能需要等待。

改为: For 循环从 1 到 ( ListofPosts Count / 100) DownloadAll(ListofPosts.Skip(xxx).Take(100));

那里显然不是真正的代码,但是您可以在对 main 函数进行少量更改的情况下执行 100 个块。

【讨论】:

  • 如果是第三方提要,可能就没那么简单了。如果他们只允许“DownloadAll”,不太可能,但你永远不知道,你不能真正正确地返回一个子集。
  • 听起来效率不高。我想随时下载100个帖子,不分批下载。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2021-07-09
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多