事件循环与多线程阻塞IO

23

我正在阅读有关服务器架构的评论。

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

在这条评论中,这个人谈到了三件事:

  1. 事件循环一次又一次地表现出对于大量低活动连接来说是非常出色的。
  2. 相比之下,使用线程或进程的阻塞IO模型已经多次被证明可以针对每个请求降低延迟,而不是事件循环。
  3. 在轻负载系统下,差异无法区分。在负载下,大多数事件循环会选择减速,而大多数阻塞模型则会选择卸载。

这些说法是否正确?

还有另一篇文章标题为“为什么事件对于高并发服务器来说是一个坏主意”。

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

2个回答

22

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

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

采用这种方法,

  1. 您永远不会生成数百万个线程。 您只需尽可能多地使用系统。
  2. 您可以利用多核基于事件的模型,而不是单个核心。

如果可能的话,您能否提供一些具体的例子?谢谢! - Jeff
1
使用QThreadPool和QRunnable实现非常容易。请查看http://doc.qt.nokia.com/4.7-snapshot/qthreadpool.html。 - sivabudh

0

不确定您所说的“低活动”是什么意思,但我认为主要因素将是您实际需要处理每个请求的工作量。假设单线程事件循环,当您处理当前请求时,没有其他客户端会得到他们的请求处理。如果您需要做很多事情来处理每个请求(“很多”意味着需要显着的CPU和/或时间),并且假设您的机器实际上能够有效地进行多任务处理(这不意味着等待共享资源,如单CPU机器或类似物),则通过多任务处理可以获得更好的性能。多任务处理可以是多线程阻塞模型,但也可以是单任务事件循环收集传入请求,将它们分配给一个多线程工厂依次处理(通过多任务处理),并尽快向您发送响应。

我认为与客户端的慢速连接并不那么重要,因为我相信操作系统会在您的应用程序之外高效地处理它(假设您不会为初始发起请求的客户端阻塞事件循环进行多次往返),但我自己还没有测试过。


这个答案需要整理一下。 - Matt Joiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接