我对Tornado框架实施长轮询存在问题。
我的requesthandler的post方法使用@asynchronous
和@gen.coroutine
进行修饰。当我将其挂起以便回调以便回写给客户端时,连接立即关闭。我看到这与@gen.coroutine
的使用有关,self.finish()
在所有期货都已产生时自动调用@web.asynchronous
@gen.coroutine
def post(self):
#mongo Motor yielding code
notifications.register_callback(self.on_message)
。
我需要这个装饰因为我使用的是Mongo Motor。
下面是一个简短的例子:
{{1}}
通知是一个全局对象,它保留一组回调,并在收到来自外部的消息时调用它们。 感谢
答案 0 :(得分:0)
如果您想使用@gen.coroutine
来调用协同程序,而不是在处理程序的末尾自动调用yield
,则需要使用@gen.engine
而不是self.finish()
。 @web.asynchronous
装饰器的代码中有注释:
# If @asynchronous is used with @gen.coroutine, (but
# not @gen.engine), we can automatically finish the
# request when the future resolves. Additionally,
# the Future will swallow any exceptions so we need
# to throw them back out to the stack context to finish
# the request.
因此,如果@asynchronous
与@gen.coroutine
一起使用,它会自动调用self.finish
,但如果与@gen.engine
一起使用,则会跳过它。