Tornado @ gen.coroutine关闭长轮询连接

时间:2014-10-17 15:18:32

标签: python tornado long-polling

我对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}}

通知是一个全局对象,它保留一组回调,并在收到来自外部的消息时调用它们。 感谢

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一起使用,则会跳过它。