我正在運行帶有Tornado的WebSocketHandler,並且在處理程序中有一個while
循環。這個循環阻止了一切 - 這非常糟糕。如何使tailstream()
函數異步(又名非阻塞)? (因爲它是現在,tailstream
塊一切,甚至使新的WebSocket連接是不可能的。我需要爲每個WebSocket連接運行。)如何在Tornado.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)
(...)
我想我可以用'threading'爲'tailstream()'添加一個線程,但是由於Tornado有'gen'引擎和所有的東西,它感覺有點髒? – knutole