[英]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.