【问题标题】:IHttpHandler: Speeding up performance with parallelism?IHttpHandler:通过并行性提高性能?
【发布时间】:2011-10-24 07:07:54
【问题描述】:
我有一个执行三个方法的 IHttpHandler:
- a = Method_A
- b = Method_B
- c = Method_C(a,b)
方法A和方法B的计算是完全独立的。方法 C 使用方法 A 和 B 的结果。目前这些方法是按顺序执行的。为了获得更好的 IHttpHandler 整体性能,我的想法是并行计算方法 A 和 B。如果 A 和 B 已完成,则应启动方法 C。这可能吗?如何实现?
问候,托尔斯滕
【问题讨论】:
标签:
c#
asp.net
multithreading
【解决方案1】:
当然可以;然而,真正的乐趣在于弄清楚它是否明智。如果工作受 CPU 限制,那么对于少量请求,它会扩展(例如,在只有你的本地机器上看起来不错) - 但是,如果有很多其他并行请求,那么您实际上可以降低性能(线程有开销,并且您有有限的内核)。
如果您的请求数量较少(即您有足够的内核来并行处理负载而不会耗尽),或者如果工作主要受 IO 限制,那么您应该没问题。
只需为其中一项启动任务:
var task = new Task<ResultType>(() => Method_B());
task.Start();
var a = Method_A();
var b = task.Result;
Method_C(a, b);
请注意,这确实引入了许多相关问题 - 例如,Method_B() 中的代码将无法直接访问任何与请求相关的上下文。理想情况下,收集Method_B() 需要的所有信息first(在主 http-request 线程上),并通过与 http-context 无关的简单数据类型将其传递。同样,任何使用线程本地数据(例如TransactionScope)的东西都不会自动流入Method_B()。
【解决方案2】:
您需要使用 TPL(任务并行库)。看看这个link。
【解决方案3】:
这是可能的而且很简单 - 使用异步扩展或只是排队工作项并使用信号来同步可用的返回。
主要问题是它是否有意义。仅当服务器不忙于计算时才有意义。因为如果是这样 - 你就不会神奇地创建新的 cpu 内核。