龙卷风+蟒蛇。等待链接操作完成回调

时间:2012-11-11 06:44:33

标签: python asynchronous callback tornado

我有一个像这样的简单处理程序:

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

但我希望结果回来,然后执行foo,然后按顺序排列。我已尝试按照http://www.tornadoweb.org/documentation/gen.html使用嵌套回调,但没有太多运气。

THX!

1 个答案:

答案 0 :(得分:4)

您正在使用gen.engine,但是您需要通过yield来调用方法调用gen.Task

我的项目示例:

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函数完成并将result的{​​{1}}发送到self.customerService.delete时,callback将返回该值并将其存储在{{} 1}}。

现在,您可以根据需要使用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

这使我可以在更多情况下使用代码而不会破损。