В ящиках Windows у меня есть несколько сценариев, в которых родительский процесс запускает дочерний процесс. По разным причинам - родительский процесс может потребоваться, чтобы прервать процесс ребенка, но (и это важно) позволяют ему убирать - т.е. запустить, наконец, условие:Изящно завершить процесс дочернего Python в Windows, так что выполняются окончательные предложения
try:
res = bookResource()
doStuff(res)
finally:
cleanupResource(res)
(Эти вещи могут быть встроены в контексте как ближе - и, как правило, связаны с аппаратным блокированием/состоянием базы данных)
Проблема в том, что я не могу найти способ оповестить ребенка в Windows (как и в среде Linux), чтобы он запускал очистить перед завершением. Я думаю, что это требует, чтобы дочерний процесс каким-то образом вызывал исключение (так как Ctrl-C).
Что я пробовал:
- os.kill
- os.signal
subprocess.Popen
с creationFlags и использованиемctypes.windll.kernel32.GenerateConsoleCtrlEvent(1, p.pid)
Abrt сигнала. Для этого требуется сигнальная ловушка и неэлементный контур, чтобы немедленно остановить его.ctypes.windll.kernel32.GenerateConsoleCtrlEvent(0, p.pid)
- ctrl-c event - ничего не сделал.
У кого-нибудь есть верный способ сделать это, чтобы ребенок мог очистить?
поместить текстовый файл в системе, что дети периодически проверять, чтобы увидеть, если они должны выйти .. будет быть довольно уверенным ... но, вероятно, есть лучший способ или открыть какой-то сокет-сервер для прослушивания на –
, вы уже используете 'signal()' для регистрации обработчика сигнала для kill -HUP? –
btw, это справа: http://stackoverflow.com/questions/5033277/how-to-achieve-desired-results-when-using-the-subprocees-popen-send-signalctrl?rq=1 почти точно что вам нужно ... –