获取并发中异常的原始行号。futures

2024-02-12

使用并发.futures 的示例(2.7 的向后移植):

import concurrent.futures  # line 01
def f(x):  # line 02
    return x * x  # line 03
data = [1, 2, 3, None, 5]  # line 04
with concurrent.futures.ThreadPoolExecutor(len(data)) as executor:  # line 05
    futures = [executor.submit(f, n) for n in data]  # line 06
    for future in futures:  # line 07
        print(future.result())  # line 08

Output:

1
4
9
Traceback (most recent call last):
  File "C:\test.py", line 8, in <module>
    print future.result()  # line 08
  File "C:\dev\Python27\lib\site-packages\futures-2.1.4-py2.7.egg\concurrent\futures\_base.py", line 397, in result
    return self.__get_result()
  File "C:\dev\Python27\lib\site-packages\futures-2.1.4-py2.7.egg\concurrent\futures\_base.py", line 356, in __get_result
    raise self._exception
TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'

String "...\_base.py", line 356, in __get_result"不是我期望看到的终点。是否有可能获得抛出异常的真实行?就像是:

  File "C:\test.py", line 3, in f
    return x * x  # line 03

在这种情况下,Python3 似乎显示了正确的行号。为什么python2.7不行?有什么解决方法吗?


我处于同样的情况,我真的需要对引发的异常进行回溯。 我能够开发这个解决方法,其中包括使用以下子类ThreadPoolExecutor.

import sys
import traceback
from concurrent.futures import ThreadPoolExecutor

class ThreadPoolExecutorStackTraced(ThreadPoolExecutor):

    def submit(self, fn, *args, **kwargs):
        """Submits the wrapped function instead of `fn`"""

        return super(ThreadPoolExecutorStackTraced, self).submit(
            self._function_wrapper, fn, *args, **kwargs)

    def _function_wrapper(self, fn, *args, **kwargs):
        """Wraps `fn` in order to preserve the traceback of any kind of
        raised exception

        """
        try:
            return fn(*args, **kwargs)
        except Exception:
            raise sys.exc_info()[0](traceback.format_exc())  # Creates an
                                                             # exception of the
                                                             # same type with the
                                                             # traceback as
                                                             # message

如果您使用此子类并运行以下代码片段:

def f(x):
    return x * x

data = [1, 2, 3, None, 5]
with ThreadPoolExecutorStackTraced(max_workers=len(data)) as executor:
    futures = [executor.submit(f, n) for n in data]
    for future in futures:
        try:
            print future.result()
        except TypeError as e:
            print e

输出将类似于:

1
4
9
Traceback (most recent call last):
  File "future_traceback.py", line 17, in _function_wrapper
    return fn(*args, **kwargs)
  File "future_traceback.py", line 24, in f
    return x * x
TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'

25

问题在于使用sys.exc_info() by the futures图书馆。来自 文档:

该函数返回一个由三个值组成的元组,这些值提供有关异常的信息 目前正在处理中。 [...] 如果堆栈上的任何位置都没有处理异常,则包含三个 None 值的元组是 回。否则,返回的值为(类型、值、回溯)。它们的含义是:类型获取 正在处理的异常的异常类型(类对象);值获取异常 参数(其关联值或 raise 的第二个参数,始终是类实例 如果异常类型是类对象); Traceback 获取一个封装了以下内容的 Traceback 对象 异常最初发生处的调用堆栈。

现在,如果你看一下源代码futures你可以自己看看为什么回溯是 丢失:当发生异常并且要设置为Future仅对象sys.exc_info()[1]已通过。看:

https://code.google.com/p/pythonfutures/source/browse/concurrent/futures/thread.py https://code.google.com/p/pythonfutures/source/browse/concurrent/futures/thread.py (L:63) https://code.google.com/p/pythonfutures/source/browse/concurrent/futures/_base.py https://code.google.com/p/pythonfutures/source/browse/concurrent/futures/_base.py (L:356)

因此,为了避免丢失回溯,您必须将其保存在某个地方。我的解决方法是换行 提交到包装器的函数,包装器的唯一任务是捕获每种异常,并且 引发相同类型的异常,其消息是回溯。通过这样做,当 引发异常,它被包装器捕获并重新引发,然后当sys.exc_info()[1]被分配给例外Future对象,回溯不会丢失。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取并发中异常的原始行号。futures 的相关文章

随机推荐

  • 在调度程序任务中使用removeAll()

    在做新的事情之前 我希望我的调度程序任务从数据库中删除所有条目 执行函数如下所示 public function execute objectManager TYPO3 CMS Core Utility GeneralUtility mak
  • 如何结合callLater和addCallback?

    实在是太崩溃了 希望大家怜悯我 reactor callLater 0 myFunction parameter1 addCallback reactor stop reactor run myFunction返回一个延迟的 我希望我想做什
  • 如何自动弹出键盘?

    我有编辑文本字段 我必须在其中输入密码 但我必须推送此字段 如何在不触摸编辑文本的情况下自动弹出键盘 有一个编辑文本 xml 字段
  • Java:类继承自身

    我知道这是毫无意义的 我只是觉得这很有趣 我想更多地了解当您创建一个继承自身的类时会发生什么 从而导致堆栈溢出崩溃 令人惊奇的是 Java 允许您首先进行这样的构造 我只是猜测 但是 JVM 是否将自身置于无限循环中 试图在实例化该类之前解
  • 如何列出 Google Cloud Platform 项目的所有启用的 API 服务

    我们管理着几十个 GCP 项目 但我一直不知道如何在网站上列出每个项目所有启用的 API 服务 有一种方法可以通过 Cloud Shell 运行控制台命令来完成此操作 gcloud services list 如果我访问https cons
  • 实体框架和 Oracle Db 中的 CLOB 字符串

    我有这个模型 public class Teacher public int TeacherID get set public string Name get set public string Surname get set 当模型首次运
  • .htaccess 用于附加 https://www [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已经搜索了很长一段时间来获得解决方案或对我的查询的提示 但没有找到任何有价值的东西 基本上我的应用程序是受 SSL 保护的 我想要的只是 如果用户尝
  • 具有可排序功能的 jQuery 树视图

    我只是想知道是否有人知道有什么方法可以让 bassistance 树视图插件与 jQuery UI 的可排序插件一起使用 特别是能够将元素从嵌套 ul 拖放到父 ul 或反之亦然 另外两个要求是我能够防止拖放到指定元素上 例如 class
  • 为 Ruby Resolv.getaddress(ip) 设置超时

    我找不到在 Ruby 文档中 http ruby doc org stdlib 1 9 3 libdoc resolv rdoc Resolv html关于如何使用来自 Ruby std 库的 Resolv 类的类方法 getaddress
  • tv4.validate 始终返回 true。即使我的模式无效,即: var == "dummy"

    tv4 validate 将始终返回 true 无论架构是有效的 JSON 还是只是虚拟字符串 我浏览 stackoverflow 查找相关问题 但 banUnknownProperties 对我没有帮助 正如我所说 我什至尝试将架构变量更
  • 使用cmake编译并包含调试信息

    cmake版本2 8 5 我正在尝试使用 cmake 编译我的项目 但是 当我编译时 我认为我没有包含调试cflags 即 ggdb D DEBUG 当我尝试调试时 没有调试信息 CMakeLists txt 文件是否有任何问题 我有 3
  • ASP.NET MVC 控制器单元测试 - UrlHelper 扩展问题

    尝试做一些控制器在我的 ASP NET MVC 3 Web 应用程序中进行单元测试 我的测试是这样的 TestMethod public void Ensure CreateReviewHttpPostAction RedirectsApp
  • 如何限制WCF服务的请求执行时间?

    WCF 配置中是否有某些内容定义了在服务端执行请求的超时 例如 WCF 服务将在一段时间后停止执行请求 我有一项服务 可以根据客户的输入进行一些工作 在某些情况下 此类调用可能会花费太多时间 我想限制服务端此类请求的执行时间 而不是使用 S
  • 如何使用笔记本中的某些命令在 databricks 集群上安装库?

    实际上 我想在我的 Azure databricks 集群上安装一个库 但我无法使用 UI 方法 因为每次我的集群发生变化并且在转换过程中我无法使用 UI 将库添加到其中 是否有任何 databricks 实用程序命令可以执行此操作 CHE
  • 是否可以在 Vim 中交互式删除匹配的搜索模式?

    我想在 Vim 中寻找一个短语 找到后 我想删除该短语的出现 循环遍历所有事件的最简单方法是什么 通过n 并一一删除匹配项 我不想一次删除所有匹配项 Note 我知道我可以删除一定数量的字符或一定数量的单词 但我想专门删除搜索的匹配项 这可
  • Node.js 中的 cURL 等效项?

    我希望使用来自 Node js 的 HTTP 请求的信息 即调用远程 Web 服务并将响应回显给客户端 在 PHP 中我会使用 cURL 来做到这一点 Node 的最佳实践是什么 有关完整示例 请参阅 HTTP 模块的文档 https no
  • 在所有子图上显示 x 刻度和唯一的 y 标签

    我正在绘制共享相同 x 轴的两个子图 但是当我绘制时 我只看到第二个子图上的 x 轴刻度 如何使 x 刻度在两个子图上都可见 另外 我想为两个子图设置 y 标签 但只有第二个子图可见 您能帮忙在两个子图上显示 y 标签吗 下面是我的可重现代
  • Python Flask 跨站点 HTTP POST - 不适用于特定允许的来源

    我正在尝试让 Flask 正确处理跨站点脚本 我从这里获取了跨域装饰器片段 http flask pocoo org snippets 56 http flask pocoo org snippets 56 在下面的代码中 我放置了装饰器片
  • Python xlib 更改光标

    如何使用 Xlib 在 python 应用程序中设置根窗口 或任何其他窗口 的光标 我有一个实例display and window 根窗口 使用 C 绑定 我可以用X定义光标 https tronche com gui x xlib wi
  • 获取并发中异常的原始行号。futures

    使用并发 futures 的示例 2 7 的向后移植 import concurrent futures line 01 def f x line 02 return x x line 03 data 1 2 3 None 5 line 0