Python:从 multiprocessing.Process 获取回溯

2024-01-29

我试图从 multiprocessing.Process 获取回溯对象。 不幸的是,通过管道传递异常信息不起作用,因为回溯对象无法被腌制:

def foo(pipe_to_parent):
    try:
        raise Exception('xxx')
    except:
        pipe_to_parent.send(sys.exc_info())

to_child, to_self = multiprocessing.Pipe()
process = multiprocessing.Process(target = foo, args = (to_self,))
process.start()
exc_info = to_child.recv()
process.join()
print traceback.format_exception(*exc_info)
to_child.close()
to_self.close()

追溯:

Traceback (most recent call last):
  File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap
    self.run()
  File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run
    self._target(*self._args, **self._kwargs)
  File "foo", line 7, in foo
    to_parent.send(sys.exc_info())
PicklingError: Can't pickle <type 'traceback'>: attribute lookup __builtin__.traceback failed

还有其他方法可以访问异常信息吗?我想避免传递格式化字符串。


Using tblib https://github.com/ionelmc/python-tblib您可以传递包装的异常并稍后重新引发它们:

import tblib.pickling_support
tblib.pickling_support.install()

from multiprocessing import Pool
import sys


class ExceptionWrapper(object):

    def __init__(self, ee):
        self.ee = ee
        __, __, self.tb = sys.exc_info()

    def re_raise(self):
        raise self.ee.with_traceback(self.tb)
        # for Python 2 replace the previous line by:
        # raise self.ee, None, self.tb


# example of how to use ExceptionWrapper

def inverse(i):
    """ will fail for i == 0 """
    try:
        return 1.0 / i
    except Exception as e:
        return ExceptionWrapper(e)


def main():
    p = Pool(1)
    results = p.map(inverse, [0, 1, 2, 3])
    for result in results:
        if isinstance(result, ExceptionWrapper):
            result.re_raise()


if __name__ == "__main__":
    main()

因此,如果您在远程进程中捕获异常,请将其包装为ExceptionWrapper然后将其传回。呼唤re_raise()在主进程中将完成这项工作。

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

Python:从 multiprocessing.Process 获取回溯 的相关文章

随机推荐

  • 使用 Python 查找单词列表的字谜

    假设我有一个字符串列表 例如 car tree boy girl arc 等等 我想在该列表中找到字谜组 在这种情况下 car arc 我尝试编写代码来循环列表并比较字符串对 但如何解释字母可以采用不同顺序的事实 For the speci
  • 从数据库创建 Grails 域类

    我想从现有数据库创建 grails 域类 通常我是从域类创建数据库 现在我需要从现有数据库模式创建它 如果有可用的命令 请帮助我 我遇到了同样的问题 我发现这个 Grails 插件 https web archive org web 201
  • PHP 解析 XML 时出错(RSS 提要)

    我正在使用基于的 PHP 类在这个答案中找到的 https stackoverflow com questions 250679 best way to parse rss atom feeds with php解析五个 RSS 提要 五人
  • 关闭模态视图

    如果我没记错的话 模态视图必须从父视图中消除 而不是从模态视图本身中消除 在我当前的项目中 我有两个模式视图 在第一个中 我将数据传递给父视图 当数据传递到父视图时 执行dismiss 现在 我有另一个模态视图 它不将数据传递给父视图 所以
  • 处理 WebBrowser 控件上的按键事件?

    目前我正在使用一个可以播放的应用程序ppt并在 WebBrowser 控件中闪烁 在 WebBrowser 中 我可以使用隐藏上下文菜单 this IsWebBrowserContextMenuEnabled false 并使用捕获关键事件
  • 如何捕获 Sequelize 连接错误

    如果存在续集连接错误 如何捕获续集连接错误 我尝试做 var connection new Sequelize db uri connection on error function perhaps reconnect here 但显然这不
  • Akka Stream 和 Kamon-Prometheus 不返回任何指标,但加载空页面

    我尝试将 kamon prometheus 与 akka Stream 项目集成 但在http 本地主机 9095 http localhost 9095 它加载一个空页面 在控制台中 我可以看到一条消息 表明指标信息可在http 本地主机
  • 在 Windows 上使用 HDF5 库和 CMake(错误:“无法找到 HDF5”)

    我想在我的 C 程序中使用 HDF5 库 我在Windows 7上使用VS 2010 x64编译器和CMake 3 8 0rc2 我安装的HDF5版本是1 8 10 通过运行官方 安装程序 安装 在我的 CMakeLists 文件中 我添加
  • 如何在 Laravel 中执行 MYSQL 查询?

    我有一个 MYSQL 查询 我想在 laravel 中执行这个查询 select d1 update id from select update id count update id as ct from updates tags wher
  • 为什么 GCC 说“不再支持命名返回值”?

    我不小心将函数定义的左大括号放在 return 语句之后 int id int k return k 但 GCC 回答了一个奇怪的错误消息 错误 不再支持命名返回值 谁能解释一下这个奇怪的功能可能是什么 我从来没有听说过 See here
  • 编程中的“阻塞”是什么意思?

    有人可以提供外行定义和用例吗 阻塞 意味着调用者等待 直到被调用者完成其处理 例如 来自套接字的 阻塞读取 会等待 直到有数据返回 非阻塞 读取不会 它只是返回是否有读取的指示 通常是计数 您听到这个术语主要是围绕 API 来访问不一定需要
  • Common lisp:有没有一种不那么痛苦的方法来输入数学表达式?

    我喜欢 Common lisp 但有时输入简单的数学表达式真的很痛苦 a 8b 2 1 4bc 4b 2 1 当然我可以转换它 但是有点慢 我先写 然后在每个括号中写 我想知道这里是否有人知道更好的输入方法 我正在考虑编写一个数学宏 其中
  • Azure 逻辑应用响应 HTTP 操作在 60 秒后超时

    我有一个非常简单的 Azure 逻辑应用程序 它对 SAP Web 服务器进行 REST 调用 并在将响应发送回逻辑应用程序的调用者之前转换响应 JSON 令我困惑的是 当 SAP 调用仅花费 1 分钟多一点时 响应操作就会抛出此错误 操作
  • Python C 程序子进程挂在“for line in iter”处

    好的 我正在尝试从 python 脚本运行 C 程序 目前我正在使用一个测试 C 程序 include
  • 为什么即使参数没有经过 URL 编码,某些查询字符串仍然可以工作?

    这是一个例子 The url范围 http journals plos org plosone s file id wjVg PLOSOne formatting sample main body pdf 未编码 它包含保留字符 例如冒号
  • 如何在android中上传PDF文件到服务器?

    我提到了一些以前提出的问题 但没有得到正确的解决方案 我正在创建一个应用程序 并希望通过从文件管理器中选择它来发送 PDF 文件 感谢任何类型的帮助 只有当您必须从图库中选择 PDF 文件时 您才需要更改这行代码 intent setTyp
  • 池化还是不池化 java 加密服务提供商

    Solution MessageDigest gt 根据需要经常创建新实例 KeyFactory gt 使用单个共享实例 SecureRandom gt 使用堆栈对象池 http commons apache org proper comm
  • 敏感列表中的哪个信号触发该过程

    在VHDL中 当模拟测试平台时 我有一个过程和一个敏感度列表 是否可以查看敏感列表中的哪个信号触发了该过程 我知道这可能取决于工具 我正在使用 Xilinx ISE 模拟器是否提供此信息 您可以使用 transaction属性结合 even
  • 为什么 System.Web.HttpUtility.UrlEncode 给出的命名空间名称在 Visual C# 2008 中不存在?

    我正在尝试使用以下方法对 URL 进行编码HttpUtility UrlEncode 方法 为什么我得到 命名空间 System Web 中不存在类型或命名空间名称 HttpUtility 是否缺少程序集引用 错误 我正在使用 Visual
  • Python:从 multiprocessing.Process 获取回溯

    我试图从 multiprocessing Process 获取回溯对象 不幸的是 通过管道传递异常信息不起作用 因为回溯对象无法被腌制 def foo pipe to parent try raise Exception xxx excep