2012-11-11 46 views

回答

4

您正在使用gen.engine,但您需要使用gen.Task調用將您的方法調用爲yield。從我的一個項目

實施例:

customer = yield gen.Task(self.paymentService.charge, email, cardUri) 
sub = yield gen.Task(self.paymentService.schedule, customer) 

上面將第一執行charge部分然後返回結果,然後調用schedule並從該呼叫返回subscription對象。

您用gen.Task需要調用看起來像下面的方法:

def customer(self, email, cardUri, callback=None): 

callback將要調用的函數實際上從gen.Task返回值。

我已將它設置爲使用或不使用回調,以便更輕鬆地測試我的方法。如果callbackNone或者不是None,那麼這只是一個簡單的測試,那麼它會被調用,否則它會正常返回。

gen.Engine Docs

編輯:

好,澄清它上面,與gen.Tasks工作的完整功能如下所示。

def delete_customer(customer_id, callback): 
    result = customerService.delete(customer_id) 

    callback(result) 

以上用於gen.Task的內容如下所示。

@gen.engine 
def perform_customer_delete(customer_id) 
    result = yield gen.Task(delete_customer, customer_id) 
    return result 

這意味着調用delete_customer與參數customer_id,然後我想這個函數,返回,要給予result的結果。因此,當delete_customer函數完成並將的self.customerService.delete發送到callback時,gen.Task將返回該值並將其存儲在result中。

現在,您可以使用result但是您希望在我的示例中返回。

對於您的示例,您看起來像要執行以下操作。

@asynchronous 
@gen.engine 
def post(self): 
    result = yield gen.Task(functionOne) 
    foo = yield gen.Task(MyObject) 
    bar = yield gen.Task(AnotherObject) 

這將首先調用functionOne然後進入下一個gen.Task和執行MyObject等等。但是,您必須按照您方法中參數callback的模式進行操作,才能正確使用gen.Task,否則無法得到結果。

這就是我的第二個令人困惑的例子。

爲了解決這個問題,並允許我的代碼與gen.Task一起工作,而且我不做以下操作。

def delete_customer(customer_id, callback=None): 
    result = customerService.delete_customer(customer_id) 
    if callback: 
     callback(result) 
    return result 

這使我可以在更多的情況下使用代碼而不會損壞。

+0

我看了你的例子,發現它很混亂。爲什麼「客戶」結果與您給出的方法命名相同?另外,'self.paymentService.charge'看起來像/返回什麼?你提到'訂閱'被返回,但我沒有看到它的參考?我看了看文檔,他們也很難理解。他們的例子都沒有實際運行在他們的發佈表單中。謝謝! –

+1

好吧,第一個例子沒有綁定到方法定義,對於那裏的混淆抱歉。我會寫一個解釋什麼是預期的回報。 – sean

+0

太棒了!現在更清楚了,結合[this](http://stackoverflow.com/questions/8812715/using-a-simple-python-generator-as-a-co-routine-in-a-tornado-async-handler ), 說得通。還有一件事情 - 假設'customerService.delete'是一個也包含gen.task(嵌套)的方法,我假設需要遵循相同的邏輯,否則第二個嵌套的gen.task可能會在其父對象返回之前完成? –