11

私はPythonでスレッド化されたプログラムを書いています。このプログラムは、ユーザー (CRTL+C) の操作や、さまざまなシグナルを送信する他のプログラムによって頻繁に中断されます。これらはすべて、さまざまな方法でスレッド操作を停止する必要があります。スレッドは一連の作業単位 (私は「アトム」と呼んでいます) を順番に実行します。

各アトムは迅速かつ安全に停止できるため、スレッド自体を停止させることはかなり簡単ですが、私の質問は次のとおりです。終わり?

stop_at_next_check各アトムの前にフラグをポーリングする必要がありますか (以下の例)。フラグチェックを行うもので各アトムを装飾する必要がありますか (基本的には例と同じですが、デコレーターに隠されています)。それとも、思いもよらなかった他のテクニックを使用する必要がありますか?

例 (単純な停止フラグのチェック):

class stoppable(Thread):
    stop_at_next_check = False
    current_atom = None

    def __init__(self):
        Thread.__init__(self)

    def do_atom(self, atom):
        if self.stop_at_next_check:
            return False
        self.current_atom = atom
        self.current_atom.do_work()
        return True     

    def run(self):
        #get "work to be done" objects atom1, atom2, etc. from somewhere

        if not do_atom(atom1):
            return

        if not do_atom(atom2):
            return

        #...etc

    def die(self):
        self.stop_at_next_check = True
        self.current_atom.stop()
4

3 に答える 3

4

フラグチェックは正しいように見えますが、アトムのリストを使用してフラグを単純化する機会を逃しました。アトムをリストに入れると、do_atom()メソッドを必要とせずに単一のforループを使用でき、チェックを実行する場所の問題はそれ自体で解決します。

def run(self):
    atoms = # get atoms
    for atom in atoms:
        if self.stop_at_next_check:
             break
        self.current_atom = atom
        atom.do_work()
于 2012-10-29T16:18:43.327 に答える
0

「スレッドxは処理を続行する必要があります」フラグを作成し、スレッドが終了したら、フラグをfalseに設定します。

スレッドを直接強制終了すると、作業の一部が完了する可能性があるため、悪い形式と見なされます。

于 2012-10-29T16:16:42.697 に答える