Python 如何在Tornado.WebSocket类中异步运行循环函数?
我正在用Tornado运行一个WebSocketHandler,处理程序中有一个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) 如果这
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)
(...)