杀死主线从Python子线程

当check_Temp函数退出/引发exception时,我想杀死主进程。 我知道这可能不是这样做的最好方法,但是我必须集成很多代码,而且这很容易。 另外,我想要一个硬关机,所以没关系,如果我closures该程序后出现一些错误。

我试过os.taskskill(),sys.exit()。 os.exit()等,但subprocess并不杀死主进程。我不介意如果所有的python进程被杀死。 psutil下载受到我公司有用的IT部门的防火墙的限制,所以我想知道是否有人有另一种解决scheme。

import threading import time import os from subprocess import call #import psutil def check_Temp(temp, delay, run_event,pid): while run_event.is_set(): ##code for checking temperature will go here. time.sleep(delay) print "temp is %s \n"%temp temp=temp-1 #print os.getpid() if temp<=38: raise Exception('LowTemp') #call('pkill python', shell=True) os.popen('TASKKILL /PID '+str(pid)+' /F') #os.killall() #sys.exit() #want to exit main loop here if __name__ == "__main__": run_event = threading.Event() run_event.set() temp =45 d1=.1 #print os.getpid() pid=os.getpid(); t1 = threading.Thread(target = check_Temp, args = (temp,d1,run_event,pid)) t1.start() print "Starting" ########## main code will go here, just have a simple counter here to test the functionality. x=25 try: while 1: time.sleep(.1) x=x-1 print "x is %s \n"%x if x<0: print "x is %s"%x raise Exception('spam', 'eggs') #exit() except Exception as e: print e # the exception instance run_event.clear() t1.join() print "thread successfully closed" 

输出是

 Starting temp is 45 x is 24 temp is 44 x is 23 temp is 43 x is 22 temp is 42 x is 21 temp is 41 x is 20 temp is 40 x is 19 temp is 39 x is 18 Exception in thread Thread-1: Traceback (most recent call last): File "C:\Python26\lib\threading.py", line 532, in __bootstrap_inner self.run() File "C:\Python26\lib\threading.py", line 484, in run self.__target(*self.__args, **self.__kwargs) File "C:\PythonSv\multithread6.py", line 14, in check_Temp raise Exception('LowTemp') Exception: LowTemp x is 17 x is 16 x is 15 x is 14 x is 13 x is 12 x is 11 x is 10 x is 9 x is 8 x is 7 x is 6 x is 5 x is 4 x is 3 x is 2 x is 1 x is 0 x is -1 x is -1 ('spam', 'eggs') thread successfully closed 

Solutions Collecting From Web of "杀死主线从Python子线程"

诀窍是使用标志和回调,而不是例外。

 import threading import time import os from subprocess import call def check_Temp(temp, delay, run_event,pid, endit): while run_event.is_set(): time.sleep(delay) ##code for checking temperature will go here. print "temp is %s \n"%temp temp=temp-1 #print os.getpid() if temp<=38: print 'LowTemp %s!' % (temp, ) endit() run_event.clear() if __name__ == "__main__": run_ok = True def Terminator(): global run_ok print "Terminating" run_ok = False run_event = threading.Event() run_event.set() temp =45 d1=.1 #print os.getpid() pid=os.getpid(); run_ok = True t1 = threading.Thread(target = check_Temp, args = (temp,d1,run_event,pid, Terminator)) t1.start() print "Starting" ########## main code will go here, just have a simple counter here to test the functionality. x=25 try: while run_ok: time.sleep(.1) x=x-1 print "x is %s "%x if x<0: print "x is %s"%x raise Exception('spam', 'eggs') #exit() t1.join() print 'Finished!'