убить main thead из дочернего потока python

Я хочу убить основной процесс, когда функция check_Temp завершает / вызывает исключение. Я знаю, что это не лучший способ сделать это, но мне нужно интегрировать много кода, и это намного проще. Кроме того, мне нужно жесткое завершение работы, поэтому неважно, если я получу некоторые ошибки после закрытия программы.

Я попробовал os.taskskill (), sys.exit (). os.exit () и т. д., но дочерний процесс не убивает основной процесс. Я не против, если все процессы python будут убиты. Загрузка psutil защищена моим IT-отделом моей компании, поэтому мне было интересно, есть ли у кого-то другое решение.

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 

Хитрость заключается в использовании флагов и обратных вызовов, а не исключений.

 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!'