0

whileWebSocketHandlerを開いたまま、Tornadoでループを実行しようとしています。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これらの他のカスタム関数もあります。mongodbのカーソルをテールするために定数ループ(curse(self))を実行する必要があります-そして非同期的に、それはをブロックしませんWebSocketHandler

私の設定は間違っていますか?それらの関数を別の場所に配置する必要がありますか?(どこで?)どうすれば無限を実行し、同時にwhile loop開いたままにできますか?WebSocketHandler

4

1 に答える 1

2

ブロックする PyMongo を使用しているようです。whileループもブロックします。それを入れても、それgen.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 アプリで別のものを使用することはできません。できることは、非同期 db クライアント (たとえば、asyncmongo など) を使用することです。これにより、次のことが簡単にできるようになります。

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

ドキュメントを受信したときにコールバック メソッドを起動します。

于 2012-10-05T06:42:49.617 に答える