Удостоверяющиеся подпроцессы мертвы при выходе из программы Python

Выделение указателя ip приведет к возврату того, что происходит в это место памяти в это время.

Он возвращает 0, потому что это то, что четыре байта в ip происходят при кодировании в качестве целого.

разыменование указателя после его удаления непредсказуемо. Это может быть ноль, это может быть что-то другое, если эта память была перераспределена в другом месте.

Вам просто повезло, что при запуске вашей программы это 0.

59
задан Ali Afshar 26 November 2008 в 11:06
поделиться

6 ответов

Можно использовать atexit для этого и регистр, любой очищает задачи, которые будут выполнены, когда программа выходит.

atexit.register (func [*args [** kargs]])

В Вашем процессе очистки, можно также реализовать собственное ожидание и уничтожить его, когда желаемый тайм-аут происходит.

>>> import atexit
>>> import sys
>>> import time
>>> 
>>> 
>>>
>>> def cleanup():
...     timeout_sec = 5
...     for p in all_processes: # list of your processes
...         p_sec = 0
...         for second in range(timeout_sec):
...             if p.poll() == None:
...                 time.sleep(1)
...                 p_sec += 1
...         if p_sec >= timeout_sec:
...             p.kill() # supported from python 2.6
...     print 'cleaned up!'
...
>>>
>>> atexit.register(cleanup)
>>>
>>> sys.exit()
cleaned up!

Примечание - Зарегистрированные функции не будут выполнены, если этот процесс (родительский процесс) будет уничтожен.

следующий метод окон больше не необходим для Python> = 2.6

, Вот способ уничтожить процесс в окнах. Ваш объект Popen имеет изодромный с предварением атрибут, таким образом, можно просто назвать его [1 114] успех = win_kill (p.pid) (Потребности pywin32 установленный):

    def win_kill(pid):
        '''kill a process by specified PID in windows'''
        import win32api
        import win32con

        hProc = None
        try:
            hProc = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, pid)
            win32api.TerminateProcess(hProc, 0)
        except Exception:
            return False
        finally:
            if hProc != None:
                hProc.Close()

        return True
45
ответ дан monkut 7 November 2019 в 14:47
поделиться

Это - то, что я сделал для своего posix приложения:

, Когда Ваше приложение существует, называют уничтожение () методом этого класса: http://www.pixelbeat.org/libs/subProcess.py

использование В качестве примера здесь: http://code.google.com/p/fslint/source/browse/trunk/fslint-gui#608

0
ответ дан pixelbeat 7 November 2019 в 14:47
поделиться

опрос ()

Проверка, если дочерний процесс завершился. Атрибут кода возврата возвратов.

3
ответ дан Igal Serban 7 November 2019 в 14:47
поделиться

там способ гарантировать, что весь созданный подпроцесс мертв во время выхода программы Python? Подпроцессом я имею в виду созданных с подпроцессом. Popen ().

Вы могли нарушить инкапсуляцию и тест , который все процессы Popen завершили путем выполнения

subprocess._cleanup()
print subprocess._active == []

В противном случае, я должен выполнить итерации по всему изданию, уничтожает и затем уничтожает-9? что-нибудь инструмент для очистки?

Вы не можете удостовериться, что все подпроцессы мертвы, не выходя и уничтожая каждого оставшегося в живых. Но если у Вас есть эта проблема, это, вероятно, потому что у Вас есть более глубокая проблема проектирования.

2
ответ дан ddaa 7 November 2019 в 14:47
поделиться

На *nix's, возможно, с помощью групп процесса может выручить Вас - можно поймать подпроцессы, порожденные подпроцессами также.

if __name__ == "__main__":
  os.setpgrp() # create new process group, become its leader
  try:
    # some code
  finally:
    os.killpg(0, signal.SIGKILL) # kill all processes in my group

Другое соображение должно нарастить сигналы: от SIGTERM (сигнал по умолчанию для kill) к SIGKILL (иначе kill -9). Ожидайте короткое время между сигналами дать процессу шанс выйти чисто перед Вами kill -9 это.

33
ответ дан orip 7 November 2019 в 14:47
поделиться

Эти subprocess.Popen.wait() единственный способ гарантировать, что они мертвы. Действительно, POSIX, ОС требует, чтобы Вы ожидали на своих детях. Многие *nix's создадут процесс "зомби": мертвый ребенок, которого не ожидал родитель.

, Если ребенок довольно правильно написан, это завершается. Часто, дочерние элементы, считанные из КАНАЛА. Закрытие входа является большой подсказкой ребенку, что это должно закрыть магазин и выход.

, Если ребенок имеет ошибки и не завершается, Вам, вероятно, придется уничтожить его. Необходимо исправить эту ошибку.

, Если дочерний элемент является циклом "подачи навсегда" и не разработан для завершения, необходимо или уничтожить его или обеспечить некоторый вход или сообщение, которое вынудит его завершиться.

<час>

Редактирование.

В стандартной ОС, Вы имеете os.kill( PID, 9 ). Уничтожьте-9, резко, BTW. Если можно уничтожить их с SIGABRT (6?) или SIGTERM (15) это более вежливо.

В Windows OS, Вы не имеете os.kill, который работает. Посмотрите на этот Рецепт ActiveState для завершения процесса в Windows.

у Нас есть дочерние процессы, которые являются серверами WSGI. Для завершения их, мы делаем Получать на специальном URL; это заставляет ребенка мыться и выходить.

14
ответ дан S.Lott 7 November 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: