如何从python中的本机代码捕获运行时错误?

如何从python中的本机代码捕获运行时错误?,python,python-multiprocessing,Python,Python Multiprocessing,我有以下问题,让我们使用这个python函数 def func(): run some code here which calls some native code 在func()中,我调用了一些函数,这些函数又调用了一些本机C代码。 如果发生任何崩溃,整个python进程将同时崩溃 如何捕获并从这些错误中恢复? 我想到的一种方法是在一个单独的进程中运行这个函数,但不只是启动另一个进程,因为该函数使用了大量内存和对象,因此很难拆分它。python中是否有类似于C中fork()的东西,用于

我有以下问题,让我们使用这个python函数

def func():
   run some code here which calls some native code
在func()中,我调用了一些函数,这些函数又调用了一些本机C代码。 如果发生任何崩溃,整个python进程将同时崩溃

如何捕获并从这些错误中恢复? 我想到的一种方法是在一个单独的进程中运行这个函数,但不只是启动另一个进程,因为该函数使用了大量内存和对象,因此很难拆分它。python中是否有类似于C中fork()的东西,用于创建具有相同内存结构的相同进程的副本等

或者其他想法

更新: 在python中似乎没有捕获C运行时错误的真正方法,这些错误处于较低的级别,会使整个python虚拟机崩溃

作为解决方案,您目前有两种选择:

  • 使用os.fork(),但只能在unix(如os env)中工作

  • 使用多处理和共享内存模型在进程之间共享大对象。通常的序列化将无法处理内存中有数千GB的对象(您将耗尽内存)。不过,有一个非常好的python库,名为Ray(),它使用共享内存模型执行内存中的大对象序列化,非常适合BigData/ML工作负载—强烈推荐


  • 只要您在支持
    fork
    的操作系统上运行,
    多处理
    模块就已经创建了子流程。您可以
    os.fork
    multiprocessing.Process
    multiprocessing.Pool
    来获得您想要的。您也可以在这些系统上使用
    os.fork()
    调用。

    为什么不使用
    try
    除了
    ?如果它引发异常,您应该捕获异常。如果它真的无一例外地“崩溃”,那么它就有一个严重的bug,您对此无能为力。
    fork
    存在于python中,只要您使用支持它的柏拉图形式。Linux/Mac:Yes,Windows:No.事实上,
    多处理.Process
    会在可能的情况下分叉。如果C代码与一堆python对象交互,可能更容易使用通用序列化格式(json、msgpack等),以便C代码将数据解压到C结构中,并消除python对象的复杂性。那么,创建一个只使用C的进程并发送数据就相对容易了。try/except不会处理底层的C运行时错误。谢谢,我已经发现os.fork提供了这个功能。