繁体   English   中英

从子线程python杀死main thead

[英]kill main thead from child thread 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!'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM