[英]Parallel Library: does a delay on one degree of parallelism delay all of them?
我有一个ConcurrentBag urls
其项目正在并行处理(没有任何东西被写回集合):
urls.AsParallel<UrlInfo>().WithDegreeOfParallelism(17).ForAll( item =>
UrlInfo info = MakeSynchronousWebRequest(item);
(myProgress as IProgress<UrlInfo>).Report(info);
});
我在Web请求中将超时设置为30秒。 当遇到响应非常慢的URL时,所有并行处理都会停止。 这是预期的行为,还是我应该在我的代码中搜索一些问题?
这是进步:
myProgress = new Progress<UrlInfo>( info =>
{
Action action = () =>
{
Interlocked.Increment(ref itested);
if (info.status == UrlInfo.UrlStatusCode.dead)
{
Interlocked.Increment(ref idead);
this.BadUrls.Add(info);
}
dead.Content = idead.ToString();
tested.Content = itested.ToString();
};
try
{
Dispatcher.BeginInvoke(action);
}
catch (Exception ex)
{
}
});
这是预期的行为。 在完成所有操作之前, AsParallel
不会返回。 由于您正在进行同步请求,因此您必须等到最慢的请求完成。 但是请注意,即使你有一个非常慢的任务占用一个线程,调度程序继续安排新任务,因为旧任务完成剩余的线程。
这是一个颇具启发性的例子。 它创建了101个任务。 第一个任务占用一个线程5000毫秒,其他100个线程在剩余的20个线程上流动,每个1000毫秒。 所以它安排了20个这样的任务,每个任务运行一秒钟,经过这个周期5次,完成所有100个任务,共计5000毫秒。 但是,如果将101更改为102,则表示您在20个线程上有101个任务,最终需要6000毫秒; 第101个任务只是没有一个线程,直到5秒标记。 如果将101更改为,例如2,则说明它仍然需要5000毫秒,因为您必须等待慢速任务完成。
static void Main()
{
ThreadPool.SetMinThreads(21, 21);
var sw = new Stopwatch();
sw.Start();
Enumerable.Range(0, 101).AsParallel().WithDegreeOfParallelism(21).ForAll(i => Thread.Sleep(i==0?5000:1000));
Console.WriteLine(sw.ElapsedMilliseconds);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.