2013-12-09 80 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)