1

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

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

但我希望结果返回,然后执行 foo,然后按顺序执行 bar。我尝试过按照http://www.tornadoweb.org/documentation/gen.html使用嵌套回调,但运气不佳。

谢谢!

4

1 回答 1

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.

我将它设置为可以使用或不使用回调,因此我可以更轻松地测试我的方法。这只是一个简单的测试,如果callbackNone或不是,如果不是,None那么它会被调用,否则它会正常返回。

gen.Engine 文档

编辑:

好的,为了澄清上面的内容,一个完整的函数gen.Tasks如下所示。

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

    callback( result )

在 a 中使用时,上面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时,将返回该值并将其存储在.self.customerService.deletecallbackgen.Taskresult

现在,您可以随意使用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

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

于 2012-11-11T07:52:28.860 回答