2010-06-22 3 views
2

У меня есть скрипт python, который выполняет некоторые задания. Я использую multiprocessing.Pool, чтобы несколько рабочих выполняли некоторые команды для меня.Как запустить очистку при завершении скрипта Python

Моя проблема в том, когда я пытаюсь завершить сценарий. Когда я нажимаю Ctrl-C, я хотел бы, чтобы каждый работник немедленно очищал свой эксперимент (это какой-то пользовательский код или даже команда подпроцесса, а не только освобождение блокировок или памяти) и останавливается.

Я знаю, что могу поймать Ctrl-C с обработчиком сигнала. Как я могу заставить всех текущих работающих работников multiprocessing.Pool завершить работу, все еще выполняя команду очистки?

Pool.terminate() не будет полезен, так как процессы будут прекращены без очистки.

ответ

2

Как насчет пробовать atexit стандартный модуль?

Он позволяет вам зарегистрировать функцию, которая будет выполнена после завершения.

+0

Нет, он говорит: «Примечание: функции зарегистрированные через этот модуль не вызывается, когда программа убит сигнал ". И мне нужно, чтобы он был убит сигналом –

+0

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

0

Вы работаете в Unix? Если да, почему бы не поймать SIGTERM в подпроцессах? На самом деле, документация Process.terminate() гласит:

Terminate the process. On Unix this is done using the SIGTERM signal 

(я не проверял это.)

Смежные вопросы