0

我有一个产生 4 个线程的程序,这些线程需要无限期地保持运行,如果其中一个崩溃我需要知道以便我可以重新启动。

如果我使用一个包含 4 个数字的列表并通过使用队列将其传递给每个线程。然后每个线程所要做的就是在主线程倒计时时重置计时器中的部分。

所以队列永远不会是空的,只有一个值可以变为 0,然后如果发生这种情况,那么主线程知道它的子线程没有响应,它可以采取相应的行动。

但是每次我从队列中获取 .get() 时,它都会使其为空,所以我必须从队列中获取,存储到变量中,修改变量并将其放回队列中。

使用这样的队列作为看门狗可以吗?

4

1 回答 1

1

如果您使用Threads,您可以定期检查threading.enumerate以确保您有正确数量和类型的线程正在运行。

但是,同样,将事物传递到从线程返回的队列中是一种我至少见过用于确保线程仍在运行的技术。因此,如果我对您的理解正确,那么您所做的并不是完全疯狂。

您的“线程必须偶尔重新设置其前哨”可能更有意义,将其作为每个都应尽快响应的Queues列表。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)

请注意,您还可以使用不同的请求/响应队列来避免使用不同类型的标记值,这取决于您的实际代码,哪个看起来不那么疯狂。

于 2012-07-01T19:36:10.920 回答