LINUX.ORG.RU

python/multiprocessing Manager процесс не завершается


0

1

такая ситуация:
в главном потоке создается словарь

from multiprocessing import Manager, Process

man = Manager()
self.sqlite_storage = man.dict()

потом создается Process(), который при работе обращается к словарю

в выводе ps aux | grep python видим 3 процесса питона - один из них принадлежит этому Manager()

Если скрипт нормально завершит работу - то все процессы завершатся.

А если убить главный скрипт (он работает как cgi через апач) - то второй процесс завершается (он чекает спец. файл, куда кладется метка о необходимости завершения), а третий процесс от Manager() - остается висеть.

sudo strace -p 6644 -o test
cat test:
accept(8, <unfinished ...>

Как бы его грамотно убить при завершении скрипта?

пробовал делать del для объекта Manager(), но из порожденного процесса, т.к. в основном не знаю как перехватить нажатие Escape в браузере. Не помогло

Ответ на: комментарий от true_admin

то был мой тред
но там про процесс, который создавал я сам и тем более без ответа
но с тем я разобрался

а тут процесс порождается самим питоном при инициализации Manager() из multiprocessing

если дать скрипту закончить работу - все завершается
если убить - процесс висит бесконечно долго

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от true_admin

спасибо!
только не понимаю как это применить к питону

prctl(PR_SET_PDEATHSIG, SIGHUP);

надо прикручивать модуль prctl? можно как-то без него это сделать?

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

вот в три строки: http://stackoverflow.com/questions/1884941/killing-the-child-processes-with-t...

Но, врать не буду, возможно есть более портабельные и нормальные способы.

А ещё лучше не городить огород и посылать сигнам детям из родителя при выходе. Ну хотя бы через модуль atexit.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

спасибо за atexit, полезная вещь

а что имеется ввиду под посылать сигнал? я просто держу общую переменную stopThread и все дети завершают свою работу когда она становится True

а если загрузка в браузер прерывается Esc - аякс-функция пишет в спец.файл команду stop.
Спец. файл проверяется отдельным потоком, который, увидев в нем команду, ставит stopThread = True

sergey-novikov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.