2012-10-08 86 views
2

對不起,這個愚蠢的初學者問題,但我有一個真正的問題了解異步I/O的概念,我不談論回調和其他複雜的東西,我只是想了解「如何執行代碼的Python」python中的異步I/O是什麼?

所以在這裏我想與

class Foo() 
    take a user input # line 1 
    seek for this input from the database # line 2 
    make some operation using the database output # line 3 
    make an output to the client and show the message to the page # line 4 

瞭解,所以如果用戶將使用龍捲風例如,如果他在服務器上執行代碼的例子,那麼,假設我們有4客戶請求url匹配類Foo的頁面,那麼,Python將如何執行代碼;

ie;在Python中,因爲它是一個Script語言,那麼每一行都在執行並返回值?所以它執行線1用戶1,然後停止,服務於線1客戶端2等與客戶的其餘部分,然後跳到第2行等?

回答

2

問題與python沒有太多關係。這是一個關於異步python框架(即龍捲風)的問題。

龍捲風客戶端異步處理。這意味着,當服務器處理客戶端請求並擊中完成一些異步操作的行時(在您的示例中的數據庫查詢 - 行#2),它會中斷執行並切換到另一個客戶端。當數據庫查詢完成時,通知它會進入隊列,並且客戶端在那裏等待輪到它從停止點開始執行一次(行#3)。

龍捲風有它自己的客戶執行模式。它被稱爲reactor pattern。基本上,它意味着它在客戶端隊列中循環並在需要時處理它們(即請求通過套接字,數據庫查詢finnished)。

這種無阻塞循環是通過操作系統的實用程序完成的,如Epoll

+0

那麼如果第2行使用同步庫(例如Pymongo),那麼程序必須運行到第4行才能爲第二個客戶端服務? –

+1

是的,確實如此。自數據庫查詢完成後,使用同步庫將阻止所有客戶端的執行,從而有效地掛起整個服務器。使用txmongo代替或例如將pymongo請求委託給RESTfull API,然後您將通過異步HTTP客戶端從Tornado服務器調用該API。編寫異步服務器策略時,應儘快從處理程序返回以處理其他客戶端。 – yakxxx

+0

,因爲我以前認爲只有第2行是阻塞數據庫的問題,所以當它結束時,它會繼續行4等等,所以瓶頸只在第2行 –

1

我認爲你的問題有更多的關於python處理multithreading的方式。

雖然解釋器將永遠不可能用你的處理器多個核心(一些相關信息herehere),它支持在這個意義上不同的線程多線程可以在別人都在等待I/O執行。在你上面的例子,客戶機程序線#1)可以同時客戶端1正在等待數據庫調用(線#2)返回送達。

關於「因爲它是一種腳本語言,那麼每一行都在執行並返回值?」,不,我想不出這樣的事情; You can use generators做類似「每行返回值」的操作,但我想這不是你要找的。

+0

左右發電機,龍捲風使用它們,http://www.tornadoweb.org/documentation/gen.html,因爲在第一次,我認爲,因爲它不像在C或C++中等待編譯時間來執行,我說可以爲用戶提供服務只使用它需要的一些線,讓他等一段時間去服務另一個線 –