2013-08-05 4 views
1

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

Я пробовал 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 

ответ

2

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

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

Большое спасибо! – Illusionist