4
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 脚本有任何有用的结果

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

4

2 回答 2

10

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()

...导致 aSIGTERM被发送到bash,并且下一次调用 top.stdout.readline()引发异常,这将终止线程。

于 2013-04-28T11:08:38.723 回答
6

Python线程不容易杀死,您可以使用几乎相同的多处理模块(http://docs.python.org/2/library/multiprocessing.html),它具有终止()函数来杀死进程。

这是一个小例子,取自 python 文档。

>>> import multiprocessing, time, signal
>>> p = multiprocessing.Process(target=time.sleep, args=(1000,))
>>> print p, p.is_alive()
<Process(Process-1, initial)> False
>>> p.start()
>>> print p, p.is_alive()
<Process(Process-1, started)> True
>>> p.terminate()
>>> time.sleep(0.1)
>>> print p, p.is_alive()
<Process(Process-1, stopped[SIGTERM])> False
>>> p.exitcode == -signal.SIGTERM
True
于 2013-04-28T11:02:18.133 回答