Python使用队列进行倒计时看门狗定时器

Python使用队列进行倒计时看门狗定时器,python,queue,watchdog,Python,Queue,Watchdog,我有一个产生4个线程的程序,这些线程需要无限期地保持运行,如果其中一个崩溃,我需要知道,这样我就可以重新启动 如果我使用一个包含4个数字的列表,并使用队列将其传递给每个线程。然后,每个线程所要做的就是在主线程倒计时时重置其计时器中的部分 因此,队列永远不会为空,只有一个值可以变为0,如果发生这种情况,则主线程知道其子线程没有响应,并可以相应地执行操作 但是每次我从队列中获取.get()时,它都会使其为空,因此我必须从队列中获取,存储到变量中,修改变量并将其放回队列中 对看门狗使用这样的队列可以吗

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

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

因此,队列永远不会为空,只有一个值可以变为0,如果发生这种情况,则主线程知道其子线程没有响应,并可以相应地执行操作

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


对看门狗使用这样的队列可以吗。

如果您使用的是
线程
s,您可以定期检查以确保运行的线程数量和类型正确

但是,同样,将东西传递到从线程返回的队列中是一种技术,我至少见过这种技术用于确保线程仍在运行。所以,如果我理解正确的话,你所做的并不完全疯狂

您的“线程必须偶尔重新设置其sentinal”作为每个
线程都应尽快响应的
队列
的列表可能更有意义。这取决于你的线程是否真的在做过程密集型的事情,或者它们是否仅仅是因为接口的原因而处于后台。如果他们没有把所有的时间都花在数学上,你可以这样做:

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)

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

但是如果线程挂起怎么办?我可以不断检查它们是否处于活动状态,或者枚举计数是否正确,但是如果线程挂起,它将保持打开状态,我不知道它是否已停止工作。哦,是的,在这种情况下,偶尔使用保护值或队列ping它们是有意义的。保护值是什么意思?我需要做什么,最好的方法是什么?检查我的代码,它已损坏且未经测试,但这是我用来做你感兴趣的事情的一般技术。