1. 程式人生 > >Windows下殺掉全部的子執行緒

Windows下殺掉全部的子執行緒

最近遇到一個問題,就是在Windows下怎麼殺掉全部的子執行緒,現把解決方法記錄下。

問題來源:

  用python執行了一個bat指令碼,指令碼的內容是執行一系列的adb命令,然後執行一個server。其中需要在新的cmd視窗中執行這些命令,因為最後會在這個視窗中啟動一個server,

這個server會一直在執行。因為使用的是thrift架構,在執行測試指令碼之前,必須先先啟動這個server。現在的問題是,等到測試用例執行完畢之後,這個server還是在執行的,現在就是

想把這個server在用例執行完之後關掉,但是關不掉。原因如下:

  a)最開始是使用了os.system()來執行bat指令碼,這個方法沒有拿到PID

  b)然後使pro = subprocess.Popen(cmd.split(), shell=True, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)來新起一個執行緒,這樣雖然拿到了PID,這樣有個問題,就是

它的本質是另外開啟一個cmd命令來執行 adb命令,接下來及時使用popen.terminate()也只能關閉父程序,adb的程序會有系統來託管,這樣是不能殺死adb程序的。然後上網查了一個,發現有

subprocess有一個引數是 creationflags=subprocess.CREATE_NEW_PROCESS_GROUP官方解釋如下:

  A Popen creationflags parameter to specify that a new process group will be created. This flag is necessary for using os.kill() on the subprocess

  但是這樣還是不能解決問題,因為在執行kill()或者terminate()之後,啟動server的那個cmd視窗並沒有被關閉。

 

解決方法:

  最後實在沒有辦法,就用例一個很笨的方法,在程式執行之前,先獲取當前電腦上執行的程序有哪些,在程式執行之後,再獲取電腦上有哪些程序,前後對比一下,新增加的程序就是原來啟動的程序,今夏這些新增加的程序的PID,

當測試用例結束的時候殺掉這些程序。

 

還有一個問題很迷惑,就是使用subprocess啟動的程序,其程序ID在windows的工作管理員裡面查不到,使用taskkill命令殺程序的時候,還會提示找不到這個程序。