В Windows, используя Python, как мне убить мой процесс? - PullRequest
1 голос
/ 25 февраля 2011

Редактировать: Похоже, дубликат, но я вас уверяю, это не так. Я хочу убить текущий запущенный процесс чисто, а не убить отдельный процесс.

Проблема в том, что процесс, который я убиваю, не порожден подпроцессом или exec. Это в основном пытается убить себя.

Вот сценарий: программа выполняет очистку при выходе, но иногда это занимает слишком много времени. Я уверен, что я могу прекратить программу, потому что первый шаг в выходе из программы сохраняет базу данных. Как мне это сделать?

  • не может использовать taskkill, так как он недоступен в некоторых установках Windows, например домашние издания XP
  • Tskill также не работает

  • win32api.TerminateProcess (handle, 0) работает , но я обеспокоен тем, что это может вызвать утечку памяти, потому что у меня не будет возможности закрыть дескриптор (программа сразу останавливается после вызова TerminateProcess). примечание: да, я вынужден выйти из него, так что обязательно должны быть некоторые несвободные ресурсы, но я хочу свести это к минимуму, насколько это возможно (так как я сделаю это только в том случае, если это займет невыносимое количество времени, для лучшего пользователя) опыт) но я не думаю, что Python будет обрабатывать gc, если он принудительно завершит работу.

В настоящее время я делаю последний, так как он просто работает. Хотя я обеспокоен несвободной ручкой. Буду очень признателен за любые мысли / предложения!

Ответы [ 3 ]

1 голос
/ 25 февраля 2011

win32api.TerminateProcess (handle, 0) работает, но я обеспокоен тем, что это может привести к утечки памяти, потому что у меня не будет возможность закрыть ручку (программа сразу останавливается после вызывая TerminateProcess). примечание: да, Я вынужден покинуть его, так что есть должны быть некоторые несвободные ресурсы, но я хочу свести это к минимуму возможно (так как я сделаю это только если это берет невыносимое количество время, для лучшего пользовательского опыта) но я не думаю, что Python будет обрабатывать GC, если это принудительное прекращение.

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

Так что да, завершение вашего процесса не очень "чисто", но побочных эффектов не будет.

1 голос
/ 18 января 2013

TerminateProcess и taskkill / f не освобождают ресурсы и приводят к утечкам памяти. Вот цитата MS на terminateProcess: {... Завершение процесса не приводит к завершению дочерних процессов. Завершение процесса не обязательно удаляет объект процесса из системы. Объект процесса удаляется, когда закрывается последний дескриптор процесса. ...} MS активно использует COM и DCOM, которые совместно используют дескрипторы и ресурсы, которые ОС не отслеживает и не может отслеживать. Вместо этого следует использовать ExitProcess, если вы не собираетесь часто перезагружаться. Это позволяет процессу правильно освободить ресурсы, которые он использовал. У Linux нет этой проблемы, потому что он не использует COM или DCOM.

1 голос
/ 25 февраля 2011

Если я понимаю ваш вопрос, вы пытаетесь заставить программу закрыться.Обычно это делается с помощью sys.exit () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...