【问题标题】:Tornado: returning a value from callbackTornado:从回调中返回一个值
【发布时间】:2013-12-26 17:03:27
【问题描述】:

假设我在 Tornado 中有一个 JSON-RPC 处理程序。该处理程序中有一个名为 start_connection 的函数,其中建立了一个 websocket 连接。如何连接成功时返回消息,连接失败时返回另一条消息。

我试过了:

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装饰器并在websocket_connect之前添加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

有人知道怎么解决吗?

【问题讨论】:

    标签: python tornado yield


    【解决方案1】:

    我的错,我不得不使用 tornadorpc 的异步装饰器,如下所述:https://github.com/joshmarshall/tornadorpc#asynchronous-example

    【讨论】:

      【解决方案2】:

      我是 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() doc 推荐的 Tornado,使用 IOLoop.add_future():

      main_loop.add_future(future, some_completion_callback)
      

      【讨论】:

        猜你喜欢
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 2020-04-22
        相关资源
        最近更新 更多