龙卷风+Python。等待链接操作用回调完成

2024-06-02 06:20:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但我希望结果返回,然后执行foo,然后在一个序列中执行bar。我尝试过按照http://www.tornadoweb.org/documentation/gen.html使用嵌套回调,但没有多少运气。在

谢谢!在


Tags: selfhttp处理程序foodefbar序列result
1条回答
网友
1楼 · 发布于 2024-06-02 06:20:57

您正在使用发电机发动机,但您需要使用gen.Task调用将方法调用变成yield。在

我的一个项目的例子:

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

上面的代码将首先执行charge部分,然后返回结果,然后调用schedule并从该调用中返回{}对象。在

使用gen.Task调用的方法需要如下所示:

^{pr2}$

其中callback将是要调用的函数,以实际返回gen.Task中的值。在

我把它设置为使用或不使用回调,这样我可以更轻松地测试我的方法。这只是一个简单的测试,如果callback是否为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

这意味着用参数customer_id调用delete_customer,然后我希望这个函数的结果,返回值,被赋予result。因此,当delete_customer函数完成并将self.customerService.deleteresult发送给callbackgen.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而不需要我执行以下操作。在

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

这使我可以在更多的情况下使用代码而不会出现中断。在

相关问题 更多 >