我不确定以下两个函数之间的区别是什么:
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
。
答案 0 :(得分:2)
您无法获得返回值,至少不会像您想象的那样。您的回调甚至无法运行,直到调用spawn_callback
(即on_message
)的函数返回。只需在回调本身完成回调时做任何你想做的事情(或者传递另一个回调来调用它的结果)。
stack_context
是面向回调的代码的错误处理机制。它不允许你处理调用函数中的异常,但它确实允许你在调用函数中建立一个错误处理程序,它将跟随"跟随"代码甚至通过多个add_callback
调用链。事实证明它经常引起混淆,所以现在可以使用协同程序,我建议尽可能多地使用协同程序,当你需要回退到原始回调时,使用spawn_callback
而不是{{1}并将你的try / except处理程序放在回调本身。