我正在使用裝飾器使用@gen.coroutine
裝飾器來處理GET請求的異步協程的Python3 tornado
Web服務器。我想用這個功能從庫:Python生成器和減少
@gen.coroutine
def foo(x):
yield do_something(x)
這是很簡單的:
@gen.coroutine
def get(self):
x = self.some_parameter
yield response(foo(x))
現在假設有多個功能foo1
,foo2
,相同類型的等等。我想要做一些類似...foo3(foo2(foo1(x).result()).result())...
和yield
的方法,而不是get
方法中的response(foo(x))
。
我認爲這將很容易與reduce
和result
方法。但是,由於tornado
的工作原理,我不能強制foo
用result
方法返回某些內容。這意味着yield reduce(...)
提供了一個錯誤:「DummyFuture不支持結果阻塞」。從SO和其他地方的答案,我知道我將不得不使用IOLoop
什麼的,我聽不太懂,並...
...我的問題是,我怎麼能避免評估所有foo
s和yield
那個從get
方法未評估塊?
編輯:這不是this question重複的,因爲我想:1巢很多功能和2.儘量不向立即評估。
的可能的複製[不能調用在龍捲風期貨的結果()] (http://stackoverflow.com/questions/31172272/cant-call-result-on-futures-in-tornado) – Natecat
如果你的意思是返回一個模擬該嵌套的函數(-like)對象,那麼[this](http ://stackoverflow.com/questions/15331726/how-does-the-functools-partial-work-in-python)是合適的重複 – Natecat