【问题标题】:Limiting threads per Class限制每个类的线程
【发布时间】:2018-04-19 06:47:03
【问题描述】:

我有一个 .NET Web 应用程序,它为每个请求从一组多个 API 发送请求到其中一个 API(命中哪个 api 取决于请求类型),获取响应,处理它并返回响应.

假设在任何给定时间点,假设我们最多有100 threads,我们得到100 requests(假设每个线程都在处理一个请求),其请求需要转到API-1突然 API-1 的响应时间增加了,然后我们收到需要转到 API-2,3 ... n 的后续请求,所有这些 API 都可以正常工作。这些 API 的请求要等到一个线程才会被处理免于处理API-1,这会对 .NET Web 应用程序的整体性能产生影响。

我想要实现的是我想限制每个 API 的线程数(假设我们为每个具有一些方法的 api 有一个类),以便每个类不超过分配给它的最大线程数.

(如果我有 n 个类和 100 个线程,我应该能够将它们分成每个 100/n 个线程池)

我为线程池尝试了few links,但无法达到我想要的效果。

【问题讨论】:

  • 你是如何创建这些线程本身的?
  • API-i 主要执行 CPU 密集型或 I/O 密集型工作吗?
  • @TheGeneral 现在,让 IIS 来处理它。尚未在应用程序级别完成
  • 这是异步 I/O 和 using HttpClient right 的主要情况。每个传入请求应该只需要 1 个线程,而 ASP.NET 会处理它。
  • 如果您正在使用异步并且正在等待外部 I/O,则不会在 API-1 上等待影响性能的“阻塞线程”。请显示一些代码。很少有人能比系统管理线程或线程优先级做得更好。

标签: c# .net multithreading threadpool


【解决方案1】:

您的应用程序可能是异步编程模型的一个很好的目标,如果使用得当,可以消除阻塞线程停机问题。

C# 中的异步编程是一个非常广泛的话题,已经讨论了很多。检查以下资源:

如果您确实需要,您仍然可以像往常一样限制 ThreadPool 线程(工作者)的数量。请参阅 StackOverflow 上的 Using TPL how do I set a max threadpool size 讨论。

【讨论】:

  • 对 asymc 来说是的,No 在搞乱 ThreadPool 时。
  • @HenkHolterman 你能详细说明 ThreadPool 工人的限制吗?
  • 您应该非常厌倦干预这些设置,当然在 ASP.NET 应用程序中也是如此。 ASP.NET 做了很多线程管理,不要碍事。
  • 限制 ThreadPool 线程数量的原因是什么?由于每个任务都可以安排在任何空闲线程上,因此保持默认线程数通常可以获得最佳性能。
  • @FCin 可能的原因之一是平衡性能/地址空间和内存消耗。默认情况下受到限制。请参阅 Jon Skeet 的 ThreadPool max threads 回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2013-07-29
  • 2011-04-10
相关资源
最近更新 更多