Python 如何在Tornado.WebSocket类中异步运行循环函数?

Python 如何在Tornado.WebSocket类中异步运行循环函数?,python,asynchronous,tornado,Python,Asynchronous,Tornado,我正在用Tornado运行一个WebSocketHandler,处理程序中有一个while循环。这个循环阻塞了一切,这是非常糟糕的。如何使tailstream()函数异步(也称为非阻塞)?(就像现在一样,tailstream阻塞了一切,甚至使新的websocket连接都不可能。我需要它为每个websocket连接运行。) 我想,而没有阻止它。但是时间。睡觉去做 将其替换为yield gen.Task(IOLoop.instance().add_timeout,time.time()+5) 如果这

我正在用Tornado运行一个WebSocketHandler,处理程序中有一个
while
循环。这个循环阻塞了一切,这是非常糟糕的。如何使
tailstream()
函数异步(也称为非阻塞)?(就像现在一样,
tailstream
阻塞了一切,甚至使新的websocket连接都不可能。我需要它为每个websocket连接运行。)


我想,
没有阻止它。但是时间。睡觉去做

将其替换为
yield gen.Task(IOLoop.instance().add_timeout,time.time()+5)


如果这没有帮助,我们可以考虑解决方案的整体结构

我试试看。虽然
while
循环永远运行,只是有时会进入睡眠状态。它会为每个连接永远运行吗?看来你得重新考虑建筑了。它必须永远运行,但必须只存在一个具有永远循环的实例。创建连接池并对其进行迭代。我会让10000个客户端连接到WebSocketHandler,我想每个客户端都会产生自己的连接。我从一个可裁剪的mongodb“流”中每秒有大约100条消息,需要对每个WSH进行不同的过滤,并打印到客户端。像你提到的那样,我最好迭代一个到mongodb的“流式”连接,或者每个WSH都有自己的(异步)到mongodb的连接?我需要运行这样的循环,但同时接受新的WSH连接。(不是
time.sleep()
阻塞了顺便说一句:)你确定尾流阻塞了客户端吗?尝试仅使用
print
语句运行它,而不使用其他操作。看看行为。我想我可以为
tailstream()
threading
添加一个线程,但考虑到Tornado拥有
gen
引擎和所有功能,它感觉有点脏?
(...)
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)



    (...)