【问题标题】: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 内核。

        【讨论】:

          猜你喜欢
          • 2012-05-24
          • 2014-11-25
          • 2011-05-18
          • 1970-01-01
          • 1970-01-01
          • 2021-04-07
          • 2016-10-24
          • 2018-07-09
          • 1970-01-01
          相关资源
          最近更新 更多