2011-02-25 74 views
1

編輯:看起來像重複,但我向你保證,它不是。我期望乾淨地殺死當前正在運行的進程,而不是殺死一個單獨的進程。在使用Python的Windows中,如何殺死我的進程?

問題是我殺的過程不是由子進程或exec產生的。它基本上試圖自殺。

下面是這種情況:程序會在退出時進行清理,但有時這需要很長時間。我確信我可以終止該程序,因爲退出的第一步保存了數據庫。我如何去做這件事?

  • 無法使用taskkill,因爲它在某些Windows安裝中不可用,例如, XP
  • 家庭版
  • TSKILL也不起作用

  • win32api.TerminateProcess(手柄,0)工作,但我擔心它可能會導致內存泄漏,因爲我不會有機會關閉句柄(程序在調用TerminateProcess後立即停止)。請注意:是的,我強制退出它,所以肯定會有一些不確定的資源,但我希望儘可能地減少這種情況(因爲我只會在它無法承受的時間內纔會這樣做,以便更好地使用經驗),但我不認爲python會處理gc,如果它是強制退出。

我目前正在做最後一個,因爲它只是工作。我關心的是不一致的句柄。任何想法/建議將非常感謝!

回答

1

win32api.TerminateProcess(手柄,0) 的作品,但我擔心它可能會導致 內存泄漏,因爲我不會有機會 關閉句柄 (程序 調用了TerminateProcess後立即停止)。注意:是啊, 我的力戒菸這麼有 難免出現一些unfreed資源, 但我希望儘量減少這種儘可能 可能的(因爲我只會做它只有 它走的是難以承受的量 時間,爲更好的用戶體驗),但 我不認爲python將處理GC,如果 它是強制退出。

如果一個進程自行終止,那麼你不必擔心垃圾收集。操作系統將自動清除該進程使用的所有內存資源,因此您不必擔心內存泄漏。內存泄漏是指進程正在運行並隨着時間流逝使用越來越多的內存。

所以,以這種方式終止你的過程並不是很「乾淨」,但不會有任何不良的副作用。

+0

謝謝;這正是我所擔心的,但它看起來像窗戶清理。我結束了使用這種方法。我知道殺死這個進程有點「骯髒」,但是這樣做是爲了獲得更好的用戶體驗,並且只能作爲最後的手段(如果清理需要大於1分鐘)。 – maranas 2011-02-25 16:29:15

1

如果我理解你的問題,你試圖讓程序關閉它。這通常通過sys.exit()完成。

+0

我也試過,但問題在於程序有時會陷入退出序列本身(WM_EXIT消息)。我可以嘗試重新設計它,這樣WM_EXIT中的進程將在單獨的線程中產生,因此如果線程進程沒有響應,我可以從主線程調用sys.exit,除非有更好的方法來做到這一點。 – maranas 2011-02-25 05:17:58

1

TerminateProcess和taskkill/f不釋放資源並將導致內存泄漏。 以下是終止進程的MS報價: {...終止進程不會導致子進程終止。 終止進程不一定會從系統中刪除進程對象。當進程的最後一個句柄關閉時,進程對象被刪除。 ...MS大量使用COM和DCOM,它們共享操作系統不支持和不能跟蹤的句柄和資源。如果您不打算經常重新啓動,則應該使用ExitProcess來代替。這允許進程正確釋放它使用的資源。 Linux沒有這個問題,因爲它不使用COM或DCOM。