sを使用している場合はThread
、定期的にチェックしthreading.enumerate
て、正しい数と種類のスレッドが実行されていることを確認できます。
しかし、スレッドから返された Queue に何かを渡すことは、少なくともスレッドがまだ実行されていることを確認するために使用されている手法です。ですから、私の理解が正しければ、あなたのしていることは完全にクレイジーではありません。
「スレッドは時々そのセンティナルをリセットする必要があります」は、それぞれができるだけ早く応答することが期待されるのリストとして持つ方が理にかなっているかもしれません。これは、スレッドが実際にプロセス集約的な処理を行っているか、またはインターフェイスの理由で単にバックグラウンド化されているかによって異なります。彼らが計算にすべての時間を費やしていない場合は、次のようにすることができます。Queue
Thread
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)
異なる種類のセンティナル値を持つことを避けるために、異なるリクエスト/レスポンス キューを使用することもできることに注意してください。実際のコードによって、どれがそれほどクレイジーに見えないかによって異なります。