Регистрация рабочих процессов с помощью Parallel Python
Я унаследовал некоторые научные вычисления с использованием Parallel Python в кластере. В Parallel Python задания передаются на ppserver, который (в данном случае) общается с уже запущенными процессами ppserver на других компьютерах, передавая задачи процессам ppworkers.
Я хотел бы использовать стандартный модуль ведения журнала библиотеки для регистрации ошибок и отладки информации из функций, которые передаются на ppserver. Поскольку эти ppworkers работают как отдельные процессы (на отдельных компьютерах), я не уверен, как правильно структурировать ведение журнала. Должен ли я войти в отдельный файл для каждого процесса? Может быть, есть обработчик журнала, который сделает все это лучше?
Кроме того, мне нужны отчеты о том, какой процесс на каком компьютере обнаружил ошибку, но код, в который я пишу вход, вероятно, не знает об этих вещах; может быть, это должно происходить на уровне ppserver?
(Версия вопроса, размещенная на форумах Parallel Python, я опубликую здесь, если получу что-то от пользователя, не являющегося SO)
2 ответа
Один из способов решить вашу проблему - сделать следующее:
- В каждом рабочем процессе используйте
logging.handlers.SocketHandler
отправлять события от рабочего к выделенному процессу регистрации. - Создайте специальный процесс ведения журнала, который будет прослушивать события в сокете, основываясь на рабочем примере, приведенном в документации по адресу https://docs.python.org/3/howto/logging-cookbook.html
- Прибыль;-)
Если вы перехватываете исключения в своих рабочих функциях и записываете их в журнал, то вы сможете увидеть ошибки всех работников в одном месте.
Я бы использовал Python logging
а также socket
API-интерфейсы. Просто следуйте примеру здесь.
Просто начните ppworker
посвященный регистрации где-то, и создать новый logging.Logger
в каждом из других работников с logging.SocketHandler
указав имя хоста и порт компьютера, на котором запущено ведение журнала ppworker
,
Если у вас работает сервер системного журнала, вы также можете использовать Python syslog
модуль, который задокументирован здесь.