龙卷风 - 从IOLoop.add_callback()获取返回值

时间:2015-11-16 18:21:09

标签: tornado

我不确定以下两个函数之间的区别是什么:

 IOLoop.add_callback(callback, *args, **kwargs) 

IOLoop.spawn_callback(callback, *args, **kwargs)

我确实阅读了文档但是并没有真正理解stack_context是什么。这似乎是一种在调用其他线程但不确定之间保留变量的方法。由于spawn_callback没有使用stack_context,这是否意味着异常不会传回给来电者?

无论哪种方式,我知道我需要使用其中一个来在非协同方法中调用协程方法。但是,我不确定如何使用任何这些方法获得返回值。我需要异步调用httpClient.fetch()对象中on_message()内的tornado.websocket.WebSocketHandler

1 个答案:

答案 0 :(得分:2)

您无法获得返回值,至少不会像您想象的那样。您的回调甚至无法运行,直到调用spawn_callback(即on_message)的函数返回。只需在回调本身完成回调时做任何你想做的事情(或者传递另一个回调来调用它的结果)。

stack_context是面向回调的代码的错误处理机制。它不允许你处理调用函数中的异常,但它确实允许你在调用函数中建立一个错误处理程序,它将跟随"跟随"代码甚至通过多个add_callback调用链。事实证明它经常引起混淆,所以现在可以使用协同程序,我建议尽可能多地使用协同程序,当你需要回退到原始回调时,使用spawn_callback而不是{{1}并将你的try / except处理程序放在回调本身。