Как поймать ошибки во время выполнения из собственного кода в python?

#python #python-multiprocessing

#python #python-многопроцессорный

Вопрос:

У меня следующая проблема, позволяет использовать эту функцию python

 def func():
   run some code here which calls some native code
  

Внутри func() Я вызываю некоторые функции, которые, в свою очередь, вызывают некоторый собственный код C.
Если происходит какой-либо сбой, весь процесс python завершается сбоем.

Как можно отлавливать и исправлять такие ошибки? Один из способов, который пришел мне в голову, — запустить эту функцию в отдельном процессе, а не просто запускать другой процесс, потому что функция использует много памяти и объектов, разделить это будет очень сложно. Есть ли что-то вроде fork() в C, доступное в python, для создания копии того же самого процесса с теми же структурами памяти и т. Д.?

Или, может быть, другие идеи?

Обновление: похоже, что в python нет реального способа отлавливать ошибки времени выполнения C, они находятся на более низком уровне и приводят к сбою всей виртуальной машины Python.

В качестве решений у вас в настоящее время есть два варианта:

  1. Используйте os.fork(), но работайте только в unix, как OS env.

  2. Используйте многопроцессорную обработку и модель общей памяти для совместного использования больших объектов между процессами. Обычная сериализация просто не будет работать с объектами, которые имеют несколько гигабайт памяти (у вас просто закончится память). Однако есть очень хорошая библиотека python под названием Ray (https://docs.ray.io/en/master /), который выполняет сериализацию больших объектов в памяти с использованием модели разделяемой памяти и идеально подходит для рабочих нагрузок BigData / ML — настоятельно рекомендуется.

Комментарии:

1. почему вы не используете try and except ?

2. Если он вызывает исключение, вы должны перехватить исключение. Если он действительно «сбой» без исключения, то у него серьезная ошибка, и вы ничего не можете с этим поделать.

3. fork существует в python, пока вы находитесь на platoform, который его поддерживает. Linux / Mac: да, Windows: нет. На самом деле, multiprocessing.Process разветвляется, когда может.

4. Если код C взаимодействует с кучей объектов python, может быть проще использовать общий формат сериализации (json, msgpack и т. Д.), Чтобы код C распаковывал эти данные в структуры C и избавлялся от усложнения объекта python. Тогда было бы относительно легко создать процесс только на C и отправить данные.

5. try/except не обрабатывает базовые ошибки времени выполнения C.

Ответ №1:

Пока вы работаете в операционной системе, которая поддерживает fork это multiprocessing , модуль уже создает подпроцессы. Вы могли os.fork multiprocessing.Process бы или multiprocessing.Pool получить то, что хотите. Вы также можете использовать os.fork() вызов в этих системах.

Комментарии:

1. Спасибо, я уже выяснил, что ОС. fork предоставляет эту функциональность.