gpt4 book ai didi

c# - .NET 中的并行抓取

转载 作者:太空狗 更新时间:2023-10-30 00:10:33 25 4
gpt4 key购买 nike

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

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

我知道我可以使用线程、互斥量、信号量等来完成此操作,但它会相当复杂。是否有任何更高级别的框架(如 TPL、await/async、TPL 数据流)足够强大,可以以更简单的方式执行此应用程序?

最佳答案

我建议您使用 HttpClientTask.WhenAll,使用 SemaphoreSlim 进行简单的节流:

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));

或者,您可以使用 TPL 数据流并设置 MaxDegreeOfParallelism 进行限制。

关于c# - .NET 中的并行抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22231647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com