代码之家  ›  专栏  ›  技术社区  ›  Unknown

事件循环与多线程阻塞IO

  •  23
  • Unknown  · 技术社区  · 16 年前

    我在读一篇关于服务器架构的评论。

    http://news.ycombinator.com/item?id=520077

    在这个评论中,这个人说了三件事:

    1. 事件循环,一次又一次,被证明是真正闪耀为大量低活动连接。
    2. 相比之下,一个带有线程或进程的阻塞IO模型一次又一次地显示出来,与事件循环相比,它可以减少每个请求的延迟。
    3. 在轻负载系统上,差异是不可区分的。在负载下,大多数事件循环选择减速,大多数阻塞模型选择卸载。

    这些都是真的吗?

    还有一篇题为“为什么事件是坏主意(对于高并发服务器)”的文章。

    http://www.usenix.org/events/hotos03/tech/vonbehren.html

    2 回复  |  直到 15 年前
        1
  •  20
  •   sivabudh    15 年前

    通常,如果应用程序需要处理数百万个连接,那么可以将多线程范式与基于事件的范式结合起来。

    1. 首先,生成n个线程,其中n==计算机上的核心/处理器数量。每个线程都有一个它应该处理的异步套接字列表。
    2. 然后,对于从接受者到线程的每个新连接,“负载平衡”新的套接字,使用最少的套接字。
    3. 在每个线程中,对所有套接字使用基于事件的模型,这样每个线程实际上可以“同时”处理多个套接字。

    通过这种方法,

    1. 你永远不会产生一百万个线程。你只有你的系统能处理的尽可能多。
    2. 您使用基于多核的事件,而不是单个核心。
        2
  •  0
  •   Marius Kjeldahl    16 年前

    不知道你所说的“低活动”是什么意思,但我相信主要的因素是你实际需要做多少来处理每个请求。假设有一个单线程事件循环,那么在您处理当前请求时,没有其他客户端能够处理它们的请求。如果您需要做很多事情来处理每个请求(“很多”意味着需要大量的CPU和/或时间),并且假设您的机器实际上能够高效地进行多任务处理(花费时间并不意味着等待共享资源,如单个CPU机器或类似的资源),那么多任务处理可以提高性能。多任务可能是一个多线程阻塞模型,但它也可能是一个单一的任务事件循环,收集传入的请求,将它们传递给一个多线程工作工厂,该工厂将依次处理这些请求(通过多任务),并尽快向您发送响应。

    我不认为与客户机的缓慢连接有多重要,因为我相信操作系统会在你的应用程序之外有效地处理这一问题(假设你没有阻止最初发起请求的客户机进行多次往返的事件循环),但我自己没有测试过这一点。