gpt4 book ai didi

c# - 如何在ASP.NET中并行化CPU密集型操作

转载 作者:行者123 更新时间:2023-12-03 13:03:57 27 4
gpt4 key购买 nike

在Asp.NET MVC应用程序中,我有一个项目,其中包含要跟踪的 Activity 图。

一个项目没有一个根但有多个根。
每棵树可能很复杂而且很深,每个节点都依赖于其他节点,例如日期和细粒度的用户权限。

每次在节点上执行操作时,我都需要处理所有项目图
因为即使不同的分支也相互依赖。

该结构平面存储在SqlServer DB中。

为了创建树,我有一个递归函数,该函数可以做很多事情来为每个节点(在当前用户的上下文中)创建一些数据。

例如,我有一个包含3000个节点的项目,一次创建整个图形的调用要花2秒钟以上的时间来处理。

public static List<Nodes> GetProject(...) {
var list = new List<Nodes>;
CreateTreeRecursive(...);
return list;
}

请记住,我有多个根源。这使我可以并行处理工作并独立处理每个分支。

如果我使用Task.Run或Parallel.ForEach并行执行,则创建整个图形的时间在15到50毫秒之间,快50倍。
public static List<Nodes> GetProject2(...) {

var list = new List<Nodes>;

Parallel.ForEach(...,
(root) => {
...
});

return list;
}

坏消息是您不应该在ASP.NET中创建线程。

在特定情况下,我没有很多并发用户,但是拥有约200个用户
你真的不能确定。

另一件事是,项目中的根可能多达100个,因此会有很多线程
被创建。

该解决方案将是如此简单,但不适用。

有没有一种简单的方法可以做到这一点,或者我唯一的选择就是将工作分担给某些人
可以跨越多个线程并异步等待的外部服务?

如果是这样,我将不胜感激一些建议吗?

要明确的是,这是对项目上的任何用户交互进行的操作。
我无法缓存结果,太不稳定了。我无法进入某个地方并最终得到结果。

谢谢

最佳答案

The bad news is that you shouldn't create threads in ASP.NET.



这是不正确的,这种错误的假设阻碍了正确的解决方案。

您可以创建线程。您可能会想到的风险是,您可能会耗尽线程池的容量。通常这不容易做到。

您的线程受CPU限制。这意味着您的服务器在池耗尽之前很久就完全过载了。池容量不是您的限制因素。

通过一些假设,我们可以构成一个具体方案:一个8核服务器在8个线程中处于饱和状态(可在此处运行)。但是,如果线程数少于100,则不会将线程池视为过载。 (实际数量有所不同。在很多情况下100个都是安全的。)

此外, Parallel.ForEach使用池线程。它不会创建有意义的线程数量。每个输入项也不占用一个线程。

我看不到这里有什么可担心的。

关于c# - 如何在ASP.NET中并行化CPU密集型操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38102331/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com