#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.
В качестве решений у вас в настоящее время есть два варианта:
-
Используйте os.fork(), но работайте только в unix, как OS env.
-
Используйте многопроцессорную обработку и модель общей памяти для совместного использования больших объектов между процессами. Обычная сериализация просто не будет работать с объектами, которые имеют несколько гигабайт памяти (у вас просто закончится память). Однако есть очень хорошая библиотека python под названием Ray (https://docs.ray.io/en/master /), который выполняет сериализацию больших объектов в памяти с использованием модели разделяемой памяти и идеально подходит для рабочих нагрузок BigData / ML — настоятельно рекомендуется.
Комментарии:
1. почему вы не используете
try
andexcept
?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 предоставляет эту функциональность.