python - 使用 Future 对象静默传递异常

标签 python asynchronous tornado nonblocking coroutine

当我没有明确等待 future 协程(yield some_future_obj)的结果时,我在某些情况下使用 futures 时在 tornado 中静默传递异常时遇到问题,例如无限循环协程:

@gen.coroutine
def base_func():

    @gen.coroutine
    def tail_something():
        raise
        while True:
           yield some_other_coroutine

    base_func()

我还注意到这个话题已经被讨论过:引用herehere . 问题是,如果我们不显式地等待 future 的完成,则永远不会调用 future.result() 并且永远不会引发异常。但是 tornado.concurrent promise 使用 concurrent.futures 包。

现在我只是将 ioloop.add_future 卡在当前循环上并简单地执行 log.exception(future.result())。但我不喜欢这种方法,因为它有点嘈杂(生产代码中的冗余行)。

请贡献你的想法或者可能是一个真正的答案。

最佳答案

Futures“隐藏”异常的原因是您必须决定在哪里您希望异常显示。如果您希望能够在您的代码中处理异常,您必须在某处访问它的结果(在 Tornado 协程中这意味着产生它)。如果你只想记录异常,你可以让 IOLoop 为你做:

IOLoop.instance().add_future(fut, lambda fut: fut.result())

请注意,我只是调用 result() 而不是记录它的值。这确保我们在没有错误时不记录任何内容,并且异常(带回溯)由 IOLoop 的正常未处理异常机制记录。

关于python - 使用 Future 对象静默传递异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19205828/

相关文章:

python - Ruby 的 ERB 类似 python 中的特性

nginx - 在 Tornado v4+ 下,WebSocket 连接被 403 拒绝

javascript - 正则表达式匹配不是有效 mongo id 的字符串

iphone - UIRefreshControl 无限期挂起

wcf - 我陷入僵局了吗?为什么?

.net - AsyncCommand CanExecute 处理程序

Python Tornado 全局变量

Mac OS X 中的 Python Errno 9 错误文件描述符

python - 如何获取当前工作表的gid?

python - 无法将值插入 QSqlDatabase