如果我正在编写 HTTP 服务器,为什么要考虑在自己的线程中处理每个 HTTP 连接?
我读过很多关于事件驱动的 HTTP 服务器比线程驱动的服务器更快、更具可扩展性的论点。(例如,请参阅Nginx上的 Ars Technica )。然而,世界上最受欢迎的服务器 Apache 是线程驱动的。为什么?有什么优势?
如果我正在编写 HTTP 服务器,为什么要考虑在自己的线程中处理每个 HTTP 连接?
我读过很多关于事件驱动的 HTTP 服务器比线程驱动的服务器更快、更具可扩展性的论点。(例如,请参阅Nginx上的 Ars Technica )。然而,世界上最受欢迎的服务器 Apache 是线程驱动的。为什么?有什么优势?
编写代码很简单。
基本上,如果没有语言支持(例如 C# 和 VB 将在他们的下一个版本中获得)和非常好的库,编写异步代码是很困难的。并非不可能,而且毫无疑问,那些能够做到这一点的人会站在他们的头上发表评论,但它比同步版本更难。我们更善于考虑从上到下执行的代码,而不是必须可重入的代码等。
根据您的平台,这些天线程可能非常便宜 - 因此通过适当的池,每个请求的线程模型对于不需要一次处理那么多请求的服务器非常有效。当然,对于长轮询,或者大多数需要将请求委托给其他服务的服务器,这些服务可能需要“一段时间”才能返回(即使这只是十分之一秒),这很糟糕。后一类服务器应该能够处理巨大的请求率,因为他们只做最少的处理来完成他们的工作 - 但如果他们为每个请求占用一个线程只是为了在等待另一个服务返回时阻塞,那可能是非常浪费,尤其是内存。