在.NET中并行抓取

Bob*_*Bob 4 .net c# task-parallel-library async-await tpl-dataflow

我工作的公司运行着几百个非常动态的网站.它决定建立一个搜索引擎,我的任务是编写刮刀.有些网站在旧硬件上运行,无法承受太多惩罚,而其他网站则可以处理大量的并发用户.

我需要能够说对站点A使用5个并行请求,对站点B使用2个,对站点C使用1个并行请求.

我知道我可以使用线程,互斥体,信号量等来实现这一目标,但它会非常复杂.是否有任何更高级别的框架,如TPL,await/async,TPL Dataflow足够强大,能够以更简单的方式完成此应用程序?

Ste*_*ary 10

我推荐你使用HttpClientwith Task.WhenAllwith with SemaphoreSlimsimple throttle:

private SemaphoreSlim _mutex = new SemaphoreSlim(5);
private HttpClient _client = new HttpClient();
private async Task<string> DownloadStringAsync(string url)
{
  await _mutex.TakeAsync();
  try
  {
    return await _client.GetStringAsync(url);
  }
  finally
  {
    _mutex.Release();
  }
}

IEnumerable<string> urls = ...;
var data = await Task.WhenAll(urls.Select(url => DownloadStringAsync(url));
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用TPL Dataflow并设置MaxDegreeOfParallelism限制.