2010-05-25 71 views
3

在一個掛架控制器中,我想首先返回對請求的響應(以便用戶儘快得到響應),然後執行一些不需要的附加操作(比如更新視圖計數等)恰好產生了迴應。做這種事情的最佳做法是什麼?在塔架中,如何在編寫回應後執行操作?

謝謝!

回答

2

在大多數基於wsgi的服務器上(比如標準的wsgiref,nwsgi等),有一種方法可以將身體的某些部分發送出去併發送更多的內容。我想「發送更多」是可選的。

使用收益而不是回報。 WSGI的例子(不知道是否轉換順利進入主塔):

def application(environ, start_response): 
    start_response('200 OK', [('Content-type','text/plain')]) 
    yield 'body starts. You should see this in browser already' 
    # do something 
    yield 'some more of body' 

一旦請求處理用完的代碼運行,它關閉連接。

現在,這一定會在我嘗試過的標準wsgi服務器上工作。我想聽聽這是否適用於主塔。

+0

請注意,很多WSGI中間件在傳遞之前都會收集所有響應。 IIRC WebError就像這樣,所以如果你在Pylons的development.ini文件中debug = true,那麼這種背景可能不起作用。 – 2010-07-07 21:48:25

0

我沒有嘗試Python的線程還沒有機會,但你可以這樣做:

def controller_method(self): 
    # controller logic here 
    html = render('/template.mako') 
    # start a thread here 
    return html 

通過所有的邏輯後,啓動線程,但只是在返回前,你應該避免衝突線程。

您可能還會看看RabbitMQ或其他消息隊列軟件。您可以通過發送隊列中的作業來卸載主要的Web應用程序。

+0

謝謝!我想有沒有簡單的方法來刷新響應,然後在相同的請求線程中做更多的工作? – 2010-05-27 17:43:15

+0

我不這麼認爲。如果您查看可以製作的最基本的WSGI應用程序,則可以將HTML發送到您的函數中的瀏覽器。 – 2010-05-29 21:29:58

+0

線程可能工作,但他們可能不會。尤其是長壽命的後臺線程和服務器關閉有問題:如果你不讓它們守護線程,服務器可能永遠不會關閉;如果你使它們成爲守護進程線程,那麼它們可能會在關鍵操作中被中斷,並帶有奇怪的副作用,如所有模塊全局變爲None,導致出現奇怪的錯誤。我還沒有使用Pylons環境中的線程,但Pylons郵件列表對這些問題進行了一些討論。 – 2010-07-07 21:50:50