从子线程 python 中杀死主线程 [英] kill main thead from child thread python

查看:51
本文介绍了从子线程 python 中杀死主线程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在函数 check_Temp 退出/引发异常时终止主进程.我知道这可能不是最好的方法,但我必须集成很多代码,这要容易得多.另外,我确实想要硬关机,所以在关闭程序后出现一些错误也没关系.

I want to kill the main process when the function check_Temp exits/raises an exception. I know this might not be the best way of doing this but I have to integrate a lot of code, and this is much easier. Also, I do want a hard shutdown so it doesn't matter if I get some errors after shutting the program.

我尝试了 os.taskskill()、sys.exit().os.exit() 等,但子进程不会杀死主进程.我不介意是否所有 python 进程都被杀死.我公司乐于助人的 IT 部门对 psutil 下载进行了防火墙保护,所以我想知道是否有人有其他解决方案.

I tried os.taskskill(), sys.exit(). os.exit() etc but the child process does not kill the main process.I don't mind if all the python processes get killed. psutil download is firewalled by my company's helpful IT department, so I was wondering if someone has another solution.

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

推荐答案

诀窍是使用标志和回调而不是异常.

The trick is to use flags and callbacks not exceptions.

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

这篇关于从子线程 python 中杀死主线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆