2013-12-09 2 views
2

Предположим, у меня есть обработчик JSON-RPC в Tornado. В этом обработчике есть функция, называемая start_connection, в которой производится соединение через веб-соединение. Как я могу вернуть сообщение, когда соединение удастся, и вернуть другое сообщение при сбое соединения.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, а от обратного вызова. Я также попытался использовать gen.coroutine декоратора и добавив yield ключевое слово, прежде чем websocket_connect, но это привело к ошибке:

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, но позвольте мне попробовать.

Не вся идея обратного вызова на асинхронном сервере, что он будет называться LATER, заметное время после выхода websocket_connect()?

Я считаю, что вы должны будете обрабатывать результаты в самой функции обратного вызова, или сделать что-то вроде

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

и

future.add_done_callback(some_completion_callback) 

или, скорее, рекомендуется для Tornado по add_done_callback() док, используйте IOLoop.add_future() :

main_loop.add_future(future, some_completion_callback) 
Смежные вопросы