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