Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用Python的Windows中,如何终止进程?_Python_Windows_Winapi_Pywin32 - Fatal编程技术网

在使用Python的Windows中,如何终止进程?

在使用Python的Windows中,如何终止进程?,python,windows,winapi,pywin32,Python,Windows,Winapi,Pywin32,编辑:看起来像是复制品,但我向你保证,它不是。我希望干净地终止当前正在运行的进程,而不是终止一个单独的进程 问题是我正在杀死的进程不是由子进程或exec生成的。它基本上是想自杀 下面是一个场景:程序在退出时进行清理,但有时这需要很长时间。我确信我可以终止程序,因为退出的第一步保存数据库。我该怎么做呢 无法使用taskkill,因为它在某些Windows安装中不可用,例如XP的家庭版 tskill也不起作用 win32api.TerminateProcess(句柄,0)可以正常工作,但我担心它可

编辑:看起来像是复制品,但我向你保证,它不是。我希望干净地终止当前正在运行的进程,而不是终止一个单独的进程

问题是我正在杀死的进程不是由子进程或exec生成的。它基本上是想自杀

下面是一个场景:程序在退出时进行清理,但有时这需要很长时间。我确信我可以终止程序,因为退出的第一步保存数据库。我该怎么做呢

  • 无法使用taskkill,因为它在某些Windows安装中不可用,例如XP的家庭版
  • tskill也不起作用

  • win32api.TerminateProcess(句柄,0)可以正常工作,但我担心它可能会导致内存泄漏,因为我没有机会关闭句柄(程序在调用TerminateProcess后立即停止)。注意:是的,我正在强制退出它,因此肯定会有一些未经调配的资源,但我希望尽可能地减少这一点(因为我只会在花费大量时间的情况下才这么做,以获得更好的用户体验),但我认为如果强制退出,python不会处理gc


我现在正在做最后一个,因为它很有效。不过,我担心的是未经处理的手柄。如有任何想法/建议,将不胜感激

如果我理解你的问题,你是想让程序自动关闭。这通常是通过以下方式完成的

win32api.TerminateProcess(句柄,0) 有效,但我担心这可能会导致 内存泄漏,因为我没有 关闭把手的机会 (程序在运行后立即停止 调用TerminateProcess)。注:是的, 我是被迫放弃的,所以有 一定会有一些未经开采的资源, 但我想尽量减少这个 可能的(因为只有在 这是一个无法忍受的数量 时间,为了更好的用户体验)但是 我认为python不会处理gc,如果 这是强制退出

如果进程自行终止,则无需担心垃圾收集。操作系统将自动清理该进程使用的所有内存资源,因此您不必担心内存泄漏。内存泄漏是指进程正在运行并且随着时间的推移使用越来越多的内存


因此,是的,以这种方式终止进程不是很“干净”,但不会有任何不良副作用。

TerminateProcess和taskkill/f不会释放资源,并会导致内存泄漏。 以下是terminateProcess上的MS报价: {…终止进程不会导致终止子进程。 终止进程不一定会从系统中删除进程对象。当进程的最后一个句柄关闭时,进程对象将被删除。…}
MS大量使用COM和DCOM,它们共享操作系统无法跟踪的句柄和资源。如果您不打算经常重新启动,那么应该改用ExitProcess。这允许一个进程正确地释放它所使用的资源。Linux没有这个问题,因为它不使用COM或DCOM。

我也尝试过;但问题是程序有时会陷入退出序列本身(WM_退出消息)。我可以尝试重新设计它,这样WM_EXIT中的进程将在一个单独的线程中生成,这样如果线程进程没有响应,我就可以从主线程调用sys.EXIT,除非有更好的方法;这正是我所担心的,但看起来确实是windows在做清理工作。我最终使用了这种方法。我知道终止进程有点“肮脏”,但这样做是为了更好的用户体验,而且只是作为最后手段(如果清理时间>1分钟)。