2012-09-30 81 views
2

我正在運行帶有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) 



    (...)  
+0

我想我可以用'threading'爲'tailstream()'添加一個線程,但是由於Tornado有'gen'引擎和所有的東西,它感覺有點髒? – knutole

回答

2

我覺得while沒有阻止它。但是time.sleep呢!

用這個answer替換爲yield gen.Task(IOLoop.instance().add_timeout, time.time() + 5)

如果沒有幫助 - 我們可以考慮解決方案的整體結構。

+0

我會嘗試。雖然'while'循環永遠運行 - 有時會進入睡眠狀態。 – knutole

+0

它爲每個連接永遠運行?看起來你必須重新考慮建築。它必須永遠運行,但只有一個永久循環的實例必須存在。創建連接池並對其進行迭代。 –

+0

我會說10.000個連接到WebSocketHandler的客戶端 - 我猜想每個客戶端都會產生他自己的。而且我從一個可追蹤的mongodb「流」中獲得約100 msg /秒的數據,每個WSH需要針對每個WSH進行不同的過濾並打印到客戶端。像我剛纔提到的那樣,我可以通過一個「流式」連接到mongodb來迭代嗎?或者 - 每個WSH都有自己的(異步)連接到mongodb? – knutole