gpt4 book ai didi

python - 如何在不连续检查标志的情况下终止Python线程

转载 作者:太空狗 更新时间:2023-10-30 01:44:52 25 4
gpt4 key购买 nike

class My_Thread(threading.Thread):

def __init__(self):
threading.Thread.__init__(self)

def run(self):
print "Starting " + self.name
cmd = [ "bash", 'process.sh']
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
for line in iter(p.stdout.readline, b''):
print ("-- " + line.rstrip())
print "Exiting " + self.name

def stop(self):
print "Trying to stop thread "
self.run = False

thr = My_Thread()
thr.start()
time.sleep(30)
thr.stop()
thr.join()

所以我有如上所示的线程,实际上在 Windows 上工作,process.sh 是在 cygwin 中运行的 bash 脚本,大约需要 5 分钟才能完成执行,因此它不是一个循环,它是一些模拟过程

我想在此类中创建 stop() 函数,以便我可以在需要时立即终止脚本。终止后我不期望 process.sh 脚本有任何有用的结果

请你提出任何方法,如果可能的话也请给出一些解释..

最佳答案

对于您的特定示例,通过使用 Popen 对象的 terminate() 终止它生成的子进程来终止线程可能是最简单的方法。方法...

class My_Thread(threading.Thread):

def __init__(self):
threading.Thread.__init__(self)
self.process = None

def run(self):
print "Starting " + self.name
cmd = [ "bash", 'process.sh']
self.process = p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
for line in iter(p.stdout.readline, b''):
print ("-- " + line.rstrip())
print "Exiting " + self.name

def stop(self):
print "Trying to stop thread "
if self.process is not None:
self.process.terminate()
self.process = None

thr = My_Thread()
thr.start()
time.sleep(30)
thr.stop()
thr.join()

...导致 SIGTERM 被发送到 bash,并在下一次调用 p.stdout.readline() 时引发一个异常,它将终止线程。

关于python - 如何在不连续检查标志的情况下终止Python线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16262132/

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