gpt4 book ai didi

python - 从子线程 python 中杀死 main thead

转载 作者:可可西里 更新时间:2023-11-01 11:55:31 27 4
gpt4 key购买 nike

我想在函数 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!'

关于python - 从子线程 python 中杀死 main thead,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18064901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com