0

4 つのスレッドを生成するプログラムがあります。これらのスレッドは無期限に実行し続ける必要があり、そのうちの 1 つがクラッシュした場合は、再起動できるように知る必要があります。

4 つの数字のリストを使用し、それをキューを使用して各スレッドに渡すとします。次に、各スレッドがしなければならないことは、メインスレッドがカウントダウンしている間にタイマーのセクションをリセットすることだけです。

そのため、キューが空になることはなく、1 つの値だけが 0 になる可能性があり、これが発生した場合、メイン スレッドはその子が応答していないことを認識し、それに応じて動作できます。

しかし、キューから .get() を実行するたびにキューが空になるため、キューから取得して変数に格納し、変数を変更してキューに戻す必要があります。

このようなキューをウォッチドッグに使用しても問題ありませんか。

4

1 に答える 1

1

sを使用している場合はThread、定期的にチェックしthreading.enumerateて、正しい数と種類のスレッドが実行されていることを確認できます。

しかし、スレッドから返された Queue に何かを渡すことは、少なくともスレッドがまだ実行されていることを確認するために使用されている手法です。ですから、私の理解が正しければ、あなたのしていることは完全にクレイジーではありません。

「スレッドは時々そのセンティナルをリセットする必要があります」は、それぞれができるだけ早く応答することが期待されるのリストとして持つ方が理にかなっているかもしれません。これは、スレッドが実際にプロセス集約的な処理を行っているか、またはインターフェイスの理由で単にバックグラウンド化されているかによって異なります。彼らが計算にすべての時間を費やしていない場合は、次のようにすることができます。QueueThread

def guarded_thread(sentinal_queue, *args):
    while True:
        try:
            sentinal_queue.get_nowait()
            sentinal_queue.put('got it')
        except Queue.Empty:

            # we just want to make sure that we respond if we have been
            # pinged
            pass

        # do actual work with other args

def main(arguments):
    queues = [Queue() for q in range(4)]
    threads = [(Thread(target=guarded_thread, args=(queue, args)), queue)
               for queue, args in zip(queues, arguments)]

    for thread, queue in threads:
        thread.start()

    while True:
        for thread, queue in threads:
            queue.put(True)

        for thread, queue in threads:
            try:
                response = queue.get(True, MAX_TIMEOUT)
                if response != 'got it':
                    # either re-send or restart the thread
            except Queue.Empty:
                # restart the thread
        time.sleep(PING_INTERVAL)

異なる種類のセンティナル値を持つことを避けるために、異なるリクエスト/レスポンス キューを使用することもできることに注意してください。実際のコードによって、どれがそれほどクレイジーに見えないかによって異なります。

于 2012-07-01T19:36:10.920 に答える