繁体   English   中英

并行库:延迟一个并行度延迟所有这些吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM