【问题标题】:multi threading a web application多线程 Web 应用程序
【发布时间】:2009-09-09 09:39:09
【问题描述】:

我知道有很多情况是在应用程序中使用多线程的好案例,但是什么时候对 .net Web 应用程序进行多线程处理最好?

【问题讨论】:

    标签: c# asp.net .net multithreading


    【解决方案1】:

    几乎可以肯定,托管环境(IIS 等)已经对 Web 应用程序进行了多线程处理。如果您的页面受 CPU 限制(并且想要使用多个内核),那么可以说多线程是个坏主意,因为当您的系统处于负载状态时,您已经在使用它们了。

    可能提供帮助的时间是你被 IO 绑定的时候;例如,您有一个网页需要与 3 个外部 Web 服务通信、与数据库通信并写入文件(均不相关)。您可以在不同线程上并行执行这些操作(理想情况下使用内置异步操作,以最大限度地使用完成端口)以减少整体处理时间 - 所有这些都不会过多影响本地 CPU(这里真正的延迟在网络上)。

    当然,在这种情况下,您也可以通过简单地在 Web 应用程序中对工作进行排队,并使用单独的服务出列并处理它们来做得更好 - 但是您无法立即向调用者提供响应(他们' d 需要稍后再检查以验证是否完成等)。

    【讨论】:

    • 很好的答案,尤其是建议使用内置的异步操作。
    【解决方案2】:

    恕我直言,您应该避免在基于 Web 的应用程序中使用多线程。

    也许多线程应用程序可以提高标准应用程序的性能(使用正确的设计),但在 Web 应用程序中,您可能希望保持高吞吐量而不是速度。

    但如果您有几个并发连接,也许您可​​以使用并行线程而不会降低全局性能

    【讨论】:

      【解决方案3】:

      多线程是一种为单个进程提供更多处理时间以使其运行得更快的技术。它有更多的线程,因此它会占用更多的 CPU 周期。 (如果有的话,来自多个 CPU。)对于桌面应用程序,这很有意义。但是,授予 Web 用户更多的 CPU 周期会从同时执行请求的 99 个其他用户那里夺走相同的周期!所以从技术上讲,这是一件坏事。

      但是,Web 应用程序可能会使用使用多个线程的其他服务和进程。例如,数据库不会为连接到它们的每个用户创建单独的线程。它们将线程数限制为几个,将连接添加到连接池以加快使用速度。只要有可用的连接或池连接,用户就可以访问数据库。当数据库连接用尽时,用户将不得不等待。

      因此,基本上,多线程的使用可用于 Web 应用程序以减少特定时刻的活动用户数量!它允许系统与多个用户共享资源,而不会使资源过载。相反,用户只需在轮到他们之前排队即可。

      这不是 Web 应用程序本身中的多线程,而是 Web 应用程序使用的服务中的多线程。在这种情况下,它被用作限制,只允许少量线程处于活动状态。

      【讨论】:

        【解决方案4】:

        为了从多线程中受益,您的应用程序必须完成大量可以并行运行的工作。如果不是这种情况,多线程的开销很可能会超过好处。

        根据我的经验,大多数 Web 应用程序都包含许多短时间运行的方法,因此除了托管环境已经提供的并行性之外,我想说从 Web 应用程序的各个部分中的多线程中受益的情况很少见。可能有一些例子可以提供好处,但我的猜测是它不是很常见。

        【讨论】:

          【解决方案5】:

          ASP.NET 已经能够生成多个线程来并行处理多个请求,因此对于简单的请求处理,您很少需要手动生成另一个线程。但是,我遇到了一些不常见的情况,需要创建另一个线程:

          • 如果某些操作可能需要一段时间并且可以与页面处理的其余部分并行运行,您可能会在此处生成辅助线程。例如,如果您必须根据请求轮询 Web 服务,您可能会在 Page_Init 中生成另一个线程,并在 Page_PreRender 中检查结果(必要时等待)。尽管这是否会带来性能优势仍然是一个问题 - 生成线程并不便宜,并且典型的 Page_Init 和 Page_Prerender 之间的时间无论如何都以毫秒为单位。为此保留一个线程池可能会更有效一些,而且 ASP.NET 也有一些称为“异步页面”的东西,它可能更适合这种需求。
          • 如果有您希望定期清理的资源池。例如,假设您正在使用一些带有有限 .NET 绑定的奇怪 DBMS,但没有池支持(这是我的情况)。在这种情况下,您可能希望自己实现数据库连接池,这将需要一个“更清洁的线程”,例如每分钟唤醒一次并检查是否有长时间未使用的连接(并且因此可以关闭)。

          在 ASP.NET 中实现您自己的线程时要记住的另一件事 - ASP.NET 喜欢在进程一段时间不活动时终止其进程。因此,你不应该依赖你的线程永远活着。它可能随时终止,您最好做好准备。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多