我正在尝试在Tornado中运行while
循环,同时保持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
?
答案 0 :(得分:2)
看起来你正在使用PyMongo,which blocks。 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应用程序中真正拥有另一个,也不应该。您可以做的是使用异步数据库客户端(例如asyncmongo),这应该只允许您:
cursor = coll.find(tailable=True, callback=render, ...)
并在收到文档时触发您的回调方法。