У меня есть список веб-сайтов и список прокси-серверов.
У меня есть это действие
Action<string> action = (string url) =>
{
var proxy = ProxyHandler.GetProxy();
HtmlDocument html = null;
while (html == null)
{
try
{
html = htmlDocumentLoader.LoadDocument(url, proxy.Address);
// Various db manipulation code
ProxyHandler.ReleaseProxy(proxy);
}
catch (Exception exc)
{
Console.WriteLine("{0} proxies remain", ProxyHandler.ListSize());
// Various db manipulation code
proxy = ProxyHandler.GetProxy();
}
}
};
Который я звоню, используя
urlList.AsParallel().WithDegreeOfParallelism(12).ForAll(action);
или
Parallel.ForEach(urlList, action);
Мой класс ProxyHandler выглядит следующим образом
public static class ProxyHandler
{
static List<Proxy> ProxyList = new ProxyRepository().GetAliveProxies().ToList();
public static Proxy GetProxy()
{
lock (ProxyList)
{
while (ProxyList.Count == 0)
{
Console.WriteLine("Sleeping");
Thread.Sleep(1000);
}
var proxy = ProxyList[0];
ProxyList.RemoveAt(0);
return proxy;
}
}
public static void ReleaseProxy(Proxy proxy)
{
lock (ProxyList)
{
if(!ProxyList.Contains(proxy))ProxyList.Add(proxy);
}
}
public static int ListSize()
{
lock (ProxyList)
{
return ProxyList.Count;
}
}
}
Моя проблема в том, что когда он выполняется, кажется, он завершает ~ 90% веб-сайтов очень быстро, а затем занимает очень много времени, чтобы выполнить остальные.
То, что я имею в виду, это то, что из 100 URL-адресов на первые 90-е уходит столько же времени, сколько и на последние 10.
Я исключил, что прокси были мёртвыми, так как исключений не было. Похоже, что последний из пунктов в списке urlList просто занимает очень много времени.
UPDATE:
Я добавляю некоторые текущие данные, чтобы прояснить проблему:
Minute 1 2 3 4 5 6 7 8 9 16 18 19
Count 23 32 32 17 6 1 1 1 1 2 1 2
Как видите, за первые 4 минуты я выполняю 104/119 запросов. А потом все остальное занимает 15 минут.
Это похоже на проблему присоединения к потокам, но я не могу определить, что это может быть.