2013-12-09 132 views
2

假設我在Tornado中有一個JSON-RPC處理程序。在那個處理函數中有一個名爲start_connection的函數,在這個函數中建立了一個websocket連接。如何在連接成功時返回消息,並在連接失敗時返回另一條消息。Tornado:從回調中返回一個值

我嘗試這樣做:

class MainHandler(JSONRPCHandler): 

    def start_connection(self, uuid, addr): 
     try: 
      def store_connection(future): 
       conn = future.result() 
       # store conn 
       return {'success': True} 

      websocket.websocket_connect(addr, io_loop=main_loop, callback=store_connection) 

     except Exception, e: 
      return {'success': False, 'error_message': str(e)} 

但是,這並不工作,因爲成功的消息不會從start_connection返回,但是從回調。我也試過websocket_connect前使用gen.coroutine裝飾和添加yield關鍵字,但是這導致了一個錯誤:

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1115, in _stack_context_handle_exception 
    raise_exc_info((type, value, traceback)) 
    File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1298, in wrapper 
    result = method(self, *args, **kwargs) 
    File "/usr/lib/python2.7/dist-packages/tornadorpc/tornadorpc/base.py", line 259, in post 
    self._RPC_.run(self, request_body) 
    File "/usr/lib/python2.7/dist-packages/tornadorpc/tornadorpc/base.py", line 103, in run 
    self.dispatch(request[0], request[1]) 
    File "/usr/lib/python2.7/dist-packages/tornadorpc/tornadorpc/base.py", line 145, in dispatch 
    final_kwargs, extra_args = getcallargs(method, *args, **kwargs) 
    File "/usr/lib/python2.7/dist-packages/tornadorpc/tornadorpc/utils.py", line 23, in getcallargs 
    self_key = args.pop(0) 
IndexError: pop from empty list 

任何人知道如何解決這個問題?

回答

0

我是新來的Tornado,但讓我試試。

是不是在異步服務器回調的整個想法,它將被稱爲後,websocket_connect()退出後的顯着時間?

我相信你將不得不處理在回調本身的結果,或者做類似

future = websocket.websocket_connect(\ 
    addr, io_loop=main_loop, callback=store_connection) 

future.add_done_callback(some_completion_callback) 

,或者更確切地說,通過add_done_callback()文檔推薦龍捲風,使用IOLoop.add_future()

main_loop.add_future(future, some_completion_callback)