2

スレッド化を学習するために Python でスクリプトを作成しようとしていますが、スレッド内の for ループを停止できないようです。現在、私は pyInstaller を使用してスクリプトをコンパイルし、それを行うための最良の方法ではないことを知っているスレッドプロセスを終了しています。コマンドでスレッドを終了する方法を誰かに説明してもらえますか? 他の多くの質問を読みましたが、スレッドを「正しい」方法で停止する方法を理解できないようです。これをテストするために現在使用しているコードは次のとおりです。

class Thread(Thread):
        def __init__(self, command, call_back):
        self._command = command
        self._call_back = call_back
        super(Thread, self).__init__()

    def run(self):
        self._command()
        self._call_back()
def test():
    i = 20
    for n in range(0,i):
        #This is to keep the output at a constant speed
        sleep(.5)
        print n
def thread_stop():
    procs = str(os.getpid())
    PROCNAME = 'spam.exe'
    for proc in psutil.process_iter():
        if proc.name == PROCNAME:
            text = str(proc)[19:]
            head, sep, tail = text.partition(',')
            if str(head) != procs:
                subprocess.call(['taskkill', '/PID', str(head), '/F'])

関数は Tkinter で作成された GUI によって呼び出されますが、これは今のところ問題ありません。

そのすべてを読みたくない場合は、要点:Pythonのスレッドにforループがある場合、スレッドを「正しい方法」で停止するにはどうすればよいですか? ありがとう!

編集:申し訳ありませんが、最も重要だと思ったコードを引っ張ってきました。代わりに、コード全体を次に示します (これは、Python を学習するために使用しているテキスト メッセジャーですが、上記は、理解を深める前にスレッド化を初めて試みたものです)。http://pastebin.com/qaPux1yR

4

1 に答える 1

7

スレッドを強制終了してはいけません。代わりに、スレッドが定期的にチェックするある種の「シグナル」を使用し、設定されている場合、スレッドは正常に終了します。

最も単純な種類の「シグナル」は単純なブール変数であり、次のように使用できます。

class MyThread(Thread):
    def __init__(self):
        self.continue = True

    def run(self):
        while (self.continue):
            # Do usefull stuff here
            pass

    def stop(self):
        self.continue = False
于 2012-08-13T06:30:33.880 に答える