0

我试图while在 Tornado 中运行一个循环,同时保持 WebSocketHandler 处于打开状态。我试图实现gen.Task:

class WSHandler(tornado.websocket.WebSocketHandler):
    count = db.my_collection.count() - 1
    cursor = coll.find(tailable=True, await_data=True, skip=count)

    (...)

    @asynchronous
    @gen.engine
    def run(self):
        doc = yield gen.Task(curse)
        self.render(doc)

    def curse(self):
        while WSHandler.cursor.alive:
        try:
            doc = WSHandler.cursor.next()
            return doc

    def render(doc)
        for c in WSHandler.connections:
            c['id'].write_message(doc) 

所以,除了保持WebSocket开放,WSHandler还有这些其他的自定义功能。我需要运行一个常量循环(curse(self))来跟踪 mongodb 的光标 - 并且是异步的,所以它不会阻塞WebSocketHandler.

我的设置错了吗?我应该把这些功能放在其他地方吗?(在哪里?)我怎样才能运行无限while loop并同时保持开放WebSocketHandler

4

1 回答 1

2

看起来您正在使用 PyMongo,它会阻止. while循环也阻塞;把它放在 agen.Task无论如何都没有帮助。gen.Task只是回调的糖;它基本上是另一种写作方式:

def run(self):
    doc = self.curse(callback=self.render)
    self.render(doc)

def curse(self, callback=None):
    while self.cursor.alive:
        doc = self.cursor.next()
        callback(doc)

Tornado 已经是一个无限的 while 循环;你不能在 Tornado 应用程序中真正拥有另一个,你也不应该。您可以做的是使用异步数据库客户端(例如 asyncmongo),它应该允许您简单地:

cursor = coll.find(tailable=True, callback=render, ...)

并在收到文档时触发您的回调方法。

于 2012-10-05T06:42:49.617 回答