Tornado-从IOLoop.add_callback()获取返回值

Tornado-从IOLoop.add_callback()获取返回值,tornado,Tornado,我不确定以下两个功能之间的区别: IOLoop.add_callback(callback, *args, **kwargs) 及 我确实阅读了文档,但并不真正理解什么是stack\u context。这似乎是一种在调用其他线程之间保留变量的方法,但不确定。由于spawn_回调不使用stack_上下文,这是否意味着异常不会传回调用方 无论哪种方法,我都知道我需要使用其中一种方法来调用非协同路由方法中的协同路由方法。但是,我不确定如何使用这些方法中的任何一种来获取返回值。我需要在tornad

我不确定以下两个功能之间的区别:

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

我确实阅读了文档,但并不真正理解什么是
stack\u context
。这似乎是一种在调用其他线程之间保留变量的方法,但不确定。由于
spawn_回调
不使用
stack_上下文
,这是否意味着异常不会传回调用方


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

您无法获得返回值,至少不能按照您的想法。在调用
spawn\u callback
(即消息上的
)的函数返回之前,您的回调甚至无法运行。当回调在回调本身中完成时,只需执行您想执行的任何操作(或者传递另一个回调以调用其结果)


stack\u context
是面向回调代码的错误处理机制。它不允许您处理调用函数中的异常,但允许您在调用函数中建立一个错误处理程序,即使通过多个
add\u回调
调用链,它也会“跟踪”代码。事实证明,这常常会让人困惑,因为它有帮助,所以现在可以使用协同路由,我建议尽可能多地使用协同路由,当您确实需要返回原始回调时,使用
spawn\u callback
而不是
add\u callback
,并将try/except处理程序放在回调本身中。

好的,谢谢。所以如果我使用协同程序,你是说最好使用add\u回调?另外,您是否预见到将self(WebSocketHandler对象)传递到协同路由(可能是通过两层add_callback()和调用write_message()会出现问题在这些协程中?不,如果你避免协程,并且使用手动回调做任何事情,我建议使用协程生成回调并添加回调。可以将
self
传递到回调中。再次感谢Ben。CheersBen,在生成的协程函数中,我还可以生成其他协程正常对吗(如下所示)?代码可以正常工作,但我会询问,因为我不确定是否需要使用带回调的fetch来代替此…
@tornado.gen.coroutine def run(self,url):httpClient=asynchtpclient()res=yield httpClient.fetch(x)
是的,一旦你加入了一个合作项目,你就可以使用
yield
IOLoop.spawn_callback(callback, *args, **kwargs)