2012-03-08 128 views
4

我已閱讀文檔。我玩過一些例子。但是,我仍然無法理解異步的意義何時有用,以及這些奇怪的人在哪裏看起來如此瘋狂?有人可以向我解釋python-twisted像我五歲嗎?

如果只是爲了避免在等待I/O的時候爲什麼要簡單地在線程中運行?爲什麼需要延期?

我想我錯過了關於計算的一些基本知識,所以這些問題。如果是這樣,它是什麼?

+1

線程具有開銷,並等待一個線程仍花費CPU /內存。另外還有同步問題。 – Dikei 2012-03-08 11:12:49

+2

有一個着名的解釋和比較不同的I/O策略稱爲[C10K](http://www.kegel.com/c10k.html)。 – bereal 2012-03-08 11:14:50

+1

@Dikei爲什麼在異步情況下避免了這種開銷?你仍然需要等待並存儲程序數據,不是嗎? – Moonwalker 2012-03-08 11:18:01

回答

4

就像你是五...好吧:線程壞,異步好!

現在,嚴重:線程會產生開銷 - 包括解釋器的鎖定和切換,以及內存消耗和代碼複雜性。當你的程序被IO綁定,並且等待其他服務(API,數據庫)返回響應時,你基本上正在等待閒置並浪費資源。

異步IO的意義在於減少線程開銷,同時保持併發性並簡化程序,避免死鎖並降低複雜性。

認爲例如關於聊天服務器。你在服務器上有成千上萬的連接,並且你希望一些人根據它們是哪個房間來接收一些消息。用線程做這件事要比做異步方式複雜得多。

延遲 - 這只是一種簡化代碼的方法,而不是讓每個函數都有一個回調函數,當它正在等待的操作已準備好時返回。

另一個說明 - 如果你想要一個更簡單和優雅的異步IO框架,嘗試龍捲風,它基本上是一個異步Web服務器,與異步HTTP客戶端和替代延期。它寫得非常好,可以用作通用異步IO框架。

看到http://tornadoweb.org

+1

龍捲風沒有任何替代延期。它在每個呼叫站點都有手動回叫傳遞。這就是* Deferred *的替代。 – 2012-03-08 16:21:15

+1

不,龍捲風有一個新庫,可以讓你做到這一點。 http://www.ownadoweb.org/documentation/gen.html – 2012-03-08 22:58:51

+1

哇...這幾乎就像http://twistedmatrix.com/documents/current/api/twisted.internet.defer.html#inlineCallbacks,但更糟糕的是。 – 2012-03-09 02:11:45

相關問題