2010-03-12 50 views
3

什麼是裝飾Python的扭曲反應器類

@reactor.callWhenRunning, 
@results_deferred.addCallback 
@results_deferred.addErrback. 

還什麼都推遲字符串,例如在

twisted.internet.utils.getProcessOutput() 

返回一個字符串遞延究竟這裏發生的一切有什麼意義?

我是新來的扭曲,因此這可能是一個很簡單的問題,但閱讀扭曲的文檔沒有幫助我很多

回答

3

一個Deferred像一個承諾,在未來返回的輸出。你真的應該閱讀關於延期herehere的文檔。另外,你應該一般閱讀Python裝飾器。一個介紹是here

更具體地說,發生的情況是,當您調用getProcessOutput()時,結果尚未完全準備就緒。它可能在一瞬間或一小時內就緒。但是你可能不在意:只要準備好了,你可能想要把輸出傳遞給一個函數。因此,getProcessOutput不是返回輸出(不會立即準備好),而是返回一個延遲對象。當輸出終於準備就緒時,延遲對象會通知並調用您提供的任何處理函數,並傳遞實際的處理輸出數據。儘管如此,你真的應該閱讀延期。

1

我不確定python,但這看起來像一個活動對象模式,和期貨。期貨將成爲下一個C++版本的標準。如果通過活動對象及期貨讀,你會得到一個想法

+2

@anijhaw,請抵制如此使用作爲一個論壇 – 2010-03-13 13:03:00

4

在正常的編程習慣,你會怎麼做

db = Database.connect() 
result = db.getResult() 
processResult(result) 

現在根據您的數據庫和網絡,這3個語句可以在任何地方從毫秒拿幾秒鐘。

我們幾十年來一直在用這種方式進行編程,而且大多數情況下我們都在等待。

但是有一段時間你的程序不能等待結果。你會開始思考,當我等待結果時,我可以做很多其他事情。也許打印一個輸出,或處理一個功能,或者只是快速檢查插座等。

輸入扭曲和延期。

而不是在等待result,在Twisted調用特殊方法時,您將得到Deferred。你會爲這個延遲添加一個回調函數,這意味着當你有結果/答案時調用這個函數。

deferredResult = db.nonBlockingGetResult() 
deferredResult.addCallback(processOutput) 

提供如執行的第一條語句很快,它返回「東西」回來了。那東西是Deferred。那裏沒有阻塞,沒有等待。並且對此Deferred添加回調processOutput,該回調在延遲被「解僱」時調用 - 即result已準備就緒。

HTH

+0

感謝的衝動使得它晶瑩剔透 – anijhaw 2010-03-13 21:53:14