事件循环VS多线程阻塞IO

问题描述:

我读到有关服务器架构的注释。事件循环VS多线程阻塞IO

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

在此评论,该人士表示,3件事情:

  1. 事件循环,一次又一次,已被证明是真正照耀高数量低活性的连接。
  2. 相比较而言,与线程或进程一阻塞IO模型已经表明,一次又一次,相比于一个事件循环削减延迟上的每个请求的基础。
  3. 在轻负载系统的不同点是不可区分的。在负载下,大多数事件循环选择减速,大多数阻塞模型选择减轻负载。

是否有任何的这些是真的吗?

而且还另一篇文章在这里题为“为什么事件是一个坏主意(用于高并发服务器)”

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

通常情况下,如果应用程序预计将处理连接万元,你可以用基于事件的结合多线程范例。

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

通过这种方法,

  1. 你永远不会产生一个百万线程。您的系统可以处理的数量与您一样多。
  2. 您使用基于事件的多核,而不是一个单一的核心。
+0

如果可能,你可以提供一些具体的例子吗?谢谢! – Jeff 2010-05-06 13:39:55

不知道你的“低活性”的意思,但我认为主要的因素将是你实际需要做多少处理每个请求。假设有一个单线程事件循环,在处理当前请求时,没有其他客户端会处理它们的请求。如果你需要做很多的东西来处理每个请求(“很多”的意思的东西,需要显著CPU和/或时间),并假设你的机器实际上是能够有效地多任务(即服药时间并不意味着等待共享资源,就像单个CPU机器或类似机器一样),您可以通过多任务获得更好的性能。多任务可能是一个多线程的阻塞模型,但它也可能是一个单任务事件循环,收集传入的请求,将它们挖出到多线程工作器工厂,然后依次处理这些工厂(通过多任务处理),并尽快向您发送响应。我不相信与客户端的连接速度很慢,因为我相信操作系统会在你的应用程序之外有效地处理这些事务(假设你不会阻止与客户端的多次往返事件循环发起请求),但我没有自己测试过。

+0

此答案需要整理。 – 2011-08-03 02:47:35