我有一个像这样的简单处理程序:
@asynchronous
@gen.engine
def post(self):
result = functionOne()
foo = MyObject()
bar = AnotherObject()
但我希望返回结果,然后按顺序执行 foo,然后执行 bar。我试过根据 http://www.tornadoweb.org/documentation/gen.html 使用嵌套回调但运气不佳。
谢谢!
最佳答案
您正在使用 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.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
这意味着用参数 customer_id
调用 delete_customer
然后我想要这个函数的结果,返回,给 result
。因此,当 delete_customer
函数完成并将 self.customerService.delete
的 result
发送到 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
这让我可以在更多情况下使用代码而不会损坏。
关于python - Tornado + python 。等待链式操作完成回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13329162/