繁体   English   中英

WebAPI中的线程(任务)限制(或一般而言)

[英]Threads (Tasks) Limit in WebAPI (or in general)

我们正在开发WebAPI,它具有解密大约200项(可能更多)的某种逻辑。 每次解密大约需要20毫秒。 我们已经尝试并行执行任务,以便尽快完成任务,但是由于等待老线程完成(例如仅使用了少量)-整个操作大约需要1-2秒才能完成...

我们基本上想要实现的是让x个线程同时开始并在大约20毫秒后结束。

我们尝试了以下操作: 等待多个异步任务,同时设置最大运行任务

但这似乎仅描述设置限制,而我们要释放该限制...

这是一个片段:

                    var tasks = new List<Task>();
                    foreach (var element in Elements)
                    {
                        var task = new Task(() =>
                        {
                          element.Value = Cipher.Decrypt((string)element.Value);
                        }
                        });
                        task.Start();
                        tasks.Add(task);
                    }
                    Task.WaitAll(tasks.ToArray());

我们在这里想念什么?

谢谢,尼尔。

我不能在ASP.NET上推荐并行性。 这肯定会影响您的服务的可伸缩性,尤其是面向公众的服务。 我曾想过“哦,我足够聪明才能做到这一点”,并在ASP.NET应用程序中增加了并行性,而只需要在一周后将其撕裂即可。

但是,如果您真的想 ...

似乎我们正在受到某种限制

它是计算机上物理内核的限制吗?

我们尝试了以下操作:等待多个异步任务,同时设置最大运行任务

该解决方案专门用于异步并发代码(例如,受I / O约束)。 您需要的是并行 (线程)并发代码(例如,CPU绑定)。 完全不同的用例和解决方案。

我们在这里想念什么?

您当前的代码正在线程池中抛出大量同时执行的任务,这将尝试尽最大可能地处理它们。 您可以通过使用更高级别的抽象来提高效率,例如Parallel

Parallel.ForEach(Elements, element =>
{
  element.Value = Cipher.Decrypt((string)element.Value);
});

Parallel在分区和(重新)使用线程方面(即不超过内核数)更加智能。 因此,您应该看到一些加速。

但是,我希望它只是一个较小的加速。 您可能会受到物理核心数量的限制。

假设没有超线程:

如果1项需要20毫秒,那么您可以将其视为1核心需要20毫秒。 如果您想在20毫秒内完成200个项目,那么就需要200个核心。 如果您没有那么多,那就做不到...

在正常情况下,将尽可能多的任务并行调度为您的系统最佳

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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