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、次の の呼び出しp.stdout.readline()で例外が発生し、スレッドが終了します。

于 2013-04-28T11:08:38.723 に答える
6

Python スレッドは簡単に強制終了できません。ほとんど同じマルチプロセッシング モジュール ( http://docs.python.org/2/library/multiprocessing.html ) を使用でき、プロセスを強制終了するための terminate() 関数があります。

これは、python docs から取った小さな例です。

>>> 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 に答える