2013-08-05 228 views
1

当check_Temp函数退出/引发异常时,我想杀死主进程。我知道这可能不是这样做的最好方式,但我必须集成很多代码,而且这很容易。另外,我确实需要关闭硬件,因此关闭程序后出现错误并不重要。杀死主线从子线程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