python - Tornado + python 。等待链式操作完成回调

标签 python asynchronous callback tornado

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

@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 实际返回值的函数。

我将其设置为使用或不使用回调,这样我可以更轻松地测试我的方法。这只是一个简单的测试,如果 callbackNone 或者不是,如果它不是 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,否则您将无法取回结果。

这就是我的第二个令人困惑的例子发挥作用的地方。

为了绕过这个要求并允许我的代码与 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/

相关文章:

带参数的 Python Matplotlib 回调函数

python - 运行时警告: invalid value encountered in power while plotting poisson distribution

python - 从坐标元组列表中选择最小值

objective-c - 异步下载的图像仅在点击或滚动后出现在 UITableView 中

ruby-on-rails - Rails - 在 before_save 回调中保存另一个模型的对象

c++ - C++ 中的异步函数

python - Django 查询集 : Check if parent model has a child/referring model

Python pandas - 如何对封闭元素进行分组

angular - 在带有异步管道的 *ngFor 中使用带有 http-call 的函数时无限循环

c++ - 使用异步函数提升 asio 编译错误