您正在使用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
返回值。
我已將它設置爲使用或不使用回調,以便更輕鬆地測試我的方法。如果callback
是None
或者不是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
這使我可以在更多的情況下使用代碼而不會損壞。
我看了你的例子,發現它很混亂。爲什麼「客戶」結果與您給出的方法命名相同?另外,'self.paymentService.charge'看起來像/返回什麼?你提到'訂閱'被返回,但我沒有看到它的參考?我看了看文檔,他們也很難理解。他們的例子都沒有實際運行在他們的發佈表單中。謝謝! –
好吧,第一個例子沒有綁定到方法定義,對於那裏的混淆抱歉。我會寫一個解釋什麼是預期的回報。 – sean
太棒了!現在更清楚了,結合[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可能會在其父對象返回之前完成? –