如果您使用Thread
s,您可以定期检查threading.enumerate
以确保您有正确数量和类型的线程正在运行。
但是,同样,将事物传递到从线程返回的队列中是一种我至少见过用于确保线程仍在运行的技术。因此,如果我对您的理解正确,那么您所做的并不是完全疯狂。
您的“线程必须偶尔重新设置其前哨”可能更有意义,将其作为每个都应尽快响应的Queue
s列表。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)
请注意,您还可以使用不同的请求/响应队列来避免使用不同类型的标记值,这取决于您的实际代码,哪个看起来不那么疯狂。