2009-06-04 59 views
23

我讀到有關服務器架構的註釋。事件循環VS多線程阻塞IO

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

在此評論,該人士表示,3件事情:

  1. 事件循環,一次又一次,已被證明是真正照耀高數量低活性的連接。
  2. 相比較而言,與線程或進程一阻塞IO模型已經表明,一次又一次,相比於一個事件循環削減延遲上的每個請求的基礎。
  3. 在輕負載系統的不同點是不可區分的。在負載下,大多數事件循環選擇減速,大多數阻塞模型選擇減輕負載。

是否有任何的這些是真的嗎?

而且還另一篇文章在這裏題爲「爲什麼事件是一個壞主意(用於高併發服務器)」

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

回答

20

通常情況下,如果應用程序預計將處理連接萬元,你可以用基於事件的結合多線程範例。

  1. 首先,產生N個線程,其中N ==您的機器上的核心數/處理器數。每個線程都會有一個它應該處理的異步套接字列表。
  2. 然後,從接受,「負載均衡」的新插座與插座最少線程每個新的連接。
  3. 在每個線程,使用基於事件的模型對所有的插座,這樣每個線程實際上可以處理多個插座「同時」。

通過這種方法,

  1. 你永遠不會產生一個百萬線程。您的系統可以處理的數量與您一樣多。
  2. 您使用基於事件的多核,而不是一個單一的核心。
+0

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

0

不知道你的「低活性」的意思,但我認爲主要的因素將是你實際需要做多少處理每個請求。假設有一個單線程事件循環,在處理當前請求時,沒有其他客戶端會處理它們的請求。如果你需要做很多的東西來處理每個請求(「很多」的意思的東西,需要顯著CPU和/或時間),並假設你的機器實際上是能夠有效地多任務(即服藥時間並不意味着等待共享資源,就像單個CPU機器或類似機器一樣),您可以通過多任務獲得更好的性能。多任務可能是一個多線程的阻塞模型,但它也可能是一個單任務事件循環,收集傳入的請求,將它們挖出到多線程工作器工廠,然後依次處理這些工廠(通過多任務處理),並儘快向您發送響應。我不相信與客戶端的連接速度很慢,因爲我相信操作系統會在你的應用程序之外有效地處理這些事務(假設你不會阻止與客戶端的多次往返事件循環發起請求),但我沒有自己測試過。

+0

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