В Windows, используя Python, как мне убить мой процесс?

1

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

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

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

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

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

В настоящее время я делаю последнее, так как он работает. Я беспокоюсь о том, что у нас есть неплохая ручка. Любые мысли/предложения были бы очень оценены!

Теги:
winapi
pywin32

3 ответа

1
Лучший ответ

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

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

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

  • 0
    Спасибо; это было то, о чем я беспокоился, но похоже, что окна убираются. я закончил тем, что использовал этот метод. я знаю, что убивать процесс немного «грязно», но это делается для лучшего взаимодействия с пользователем, и только в качестве крайней меры (если очистка занимает> 1 минуту).
1

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

1

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

  • 0
    Я тоже это пробовал; но проблема в том, что программа иногда застревает в самой последовательности выхода (сообщение WM_EXIT). Я мог бы попытаться изменить его так, чтобы процессы в WM_EXIT были порождены в отдельном потоке, поэтому я могу вызвать sys.exit из основного потока, если многопоточные процессы не отвечают, если нет лучшего способа сделать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню