0

TerminatableThreadクラスを実装する 2 つの方法を見つけました。それぞれの長所短所や意見をお聞きしたいのですが、違いはありますか?

最初の解決策:クラスの__stop()プライベート メソッドを使用する:Thread

class TerminatableThread(threading.Thread):
    def __init__(self, *args, **argv):
        threading.Thread.__init__(self, *args, **argv)

    def terminate(self):
        threading.Thread._Thread__stop(self) #@UndefinedVariable

    @property
    def should_run(self):
        return threading.Thread.is_alive(self)

2番目の解決策:追加の使用Event

class TerminatableThread(threading.Thread):
    def __init__(self, *args, **argv):
        self.__terminated = threading.Event()
        threading.Thread.__init__(self, *args, **argv)

    def terminate(self):
        self.__terminated.set()

    @property
    def should_run(self):
        return not self.__terminated.is_set()

どう思いますか?ありがとう

4

2 に答える 2

0

Pythonスレッドはsys.exit()で閉じることもできます。これは、スレッド内からはthread.exit()と同じです。

def nuke(self):
    # set autodestruct, remove thread from stack and exit thread
    global threads
    try:
        threads.remove([self.threadId,self])
    except:
        sys.exit()
于 2012-06-18T19:47:58.247 に答える
0

最初の解決策:プライベートメソッドは変更される可能性があり、とにかく悪い形式であるため、プライベートメソッドを使用しないでください。また、スレッドは冷たく止めるべきではありません。そのスレッド内のプロセスに最初にクリーンアップする機会を与え、それ自体で終了要求に応答する必要があります。

2番目の解決策:抽象クラスは、Javaなどの他の言語よりも、Pythonではあまり一般的ではなく、必要性も低くなっています。あなたTerminatableThread自身がスレッド操作の抽象クラスである場合は、terminated動作を直接追加してみませんか?

class TerminatableThread(threading.Thread):
    def __init__(self, *args, **argv):
        super.__init__(self, *args, **argv)
        self.terminated = False

    # Note: not actually thread-safe
    def terminate(self):
        self.terminated = True

編集:「抽象クラス」の提案を削除しましたが、ある種のスレッドセーフフラグメカニズムを使用します。スレッドイベントはそうするかもしれないように聞こえるので、私はそのオプションを選びます。

于 2012-06-18T19:34:29.627 に答える