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分钟才能完成执行,以便它不是一个循环的一些模拟proecess
我想在这个类来创建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的线程是不容易杀死,你可以使用多模块( 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