3

Tornado で WebSocketHandler を実行していwhileますが、Handler 内にループがあります。このループはすべてをブロックします。これは非常に悪いことです。tailstream()関数を非同期 (ノンブロッキング)にするにはどうすればよいですか? (現状では、tailstreamすべてをブロックし、新しい websocket 接続さえも不可能にします。websocket 接続ごとに実行する必要があります。)

(...)
class WSHandler(tornado.websocket.WebSocketHandler):
    connections = []
    filters = {}


    def allow_draft76(self):
        # for iOS 5.0 Safari
        return True


    def open(self):
        self.write_message('open')
        self.count = db.my_collection.count() - 1
        self.cursor = coll.find(tailable=True, await_data=True, skip=self.count)
        self.tailstream()




    def on_message(self, message):
        print message



    def on_close(self):
        self.connections.remove(self)
        self.cb.stop()
        print 'connection closed'


    @tornado.web.asynchronous
    def tailstream(self):
        while self.cursor.alive:
            try:
                doc = self.cursor.next()
                self.print2web(doc)

            except StopIteration:
                time.sleep(1)



    (...)       
4

1 に答える 1

2

while妨げないと思います。しかし、time.sleepそうしてください!

yield gen.Task(IOLoop.instance().add_timeout, time.time() + 5)from this answerに置き換えてください。

それでも解決しない場合は、ソリューションの全体構造について考えることができます。

于 2012-10-01T08:57:40.750 に答える