2012-10-28 180 views
3

我正在編寫一個NAT的實現。我的算法如下:線程vs異步網絡(扭曲)Python

  1. 包進入
  2. 覈對查找表,如果外部添加到查找表,如果內部
  3. 交換源地址和發送的道路上包

我一直在閱讀Twisted。我很好奇Twisted是否利用了多核CPU?假設系統有成千上萬的用戶,並且一個數據包正好在另一個之後。在扭曲的情況下,查找表操作將在每個核心上同時發生。我聽到線程GIL不會允許這個。也許我可以從多處理中獲益>

Nginx是異步的,並且同時爲上千個用戶提供服務。

+1

的GIL在io綁定操作期間被釋放,所以它不應該是一個問題。 – Bakuriu

+0

線程會比異步更快嗎? – user974896

+0

如果它真的是IO綁定的,線程將不會比異步更快;對於一個線程來說,等待事情就像兩個(或十個或......)一樣容易。「 –

回答

4

不鼓勵使用扭曲的線程。它在異步使用時具有非常好的性能,但是您爲請求處理程序編寫的代碼不得阻塞。所以如果你的處理程序是一個非常大的代碼段,把它分解成更小的部分,並利用扭曲的着名Deferreds通過回調附加其他部分。它肯定需要與大多數程序員習慣的想法稍有不同,但它有好處。如果代碼具有阻塞部分(如數據庫操作)或通過網絡訪問其他資源以獲得某些結果,請嘗試爲這些任務找到異步庫,以便在這些情況下也可以使用Deferreds。如果你不能使用異步庫,你最終可能會使用deferToThread函數,它將運行你想在另一個線程中調用的函數,並返回一個Deferred,並在完成時觸發回調函數,但最好使用它作爲最後的手段,如果沒有別的辦法可以做。

這裏是Deferreds官方教程:

http://twistedmatrix.com/documents/10.1.0/core/howto/deferredindepth.html

而另一個不錯的指南,它可以幫助習慣認爲 「異步模式」:

http://ezyang.com/twisted/defer2.html

+3

」不鼓勵使用帶有扭曲的線程。「 - 事實上,並非如此。如果線程是最佳可用解決方案,則使用Twisted使用線程會受到鼓勵*。當他們比其他方法更糟糕的解決方案時使用線程是令人沮喪的 - 但這對於線程來說並不是唯一的。在使用Twisted時,使用比另一個更糟的解決方案是不鼓勵的。 ;) –

+0

那麼,我是誰,以爭論:) – andrean