返回随机错误的Python线程计时器

返回随机错误的Python线程计时器,python,timer,error-handling,Python,Timer,Error Handling,我有一个python线程,每20秒运行一次。代码是: import threading def work(): Try: #code here except (SystemExit, KeyboardInterrupt): raise except Exception, e: logger.error('error somewhere',exc_info=True) threading.Timer(20,

我有一个python线程,每20秒运行一次。代码是:

import threading
def work():
    Try:
        #code here
    except (SystemExit, KeyboardInterrupt):
        raise
    except Exception, e:
        logger.error('error somewhere',exc_info=True)    

    threading.Timer(20, work).start ();

它通常运行完全正常。偶尔,它会返回一个毫无意义的错误。这两个错误是相同的。第一个可能是合法的,但之后的错误肯定不是。然后,它每次运行线程时都返回相同的错误。如果我终止进程并重新开始,那么它将干净地运行。我完全不知道这里发生了什么。请帮忙

根据您问题中当前的定义,您很可能超过了最大递归深度。我不能确定,因为您忽略了任何可能在您的try块中明显的流量控制机会。此外,每次代码执行失败时,异常的常规捕获都会记录异常,然后使用新的记录器将您插入一个新计时器(假设您在try块中声明)。我想你可能打算做以下事情:

import threading
import time
def work():
    try:
        #code here
        pass
    except (SystemExit, KeyboardInterrupt):
        raise
    except Exception, e:
        logger.error('error somewhere',exc_info=True)    

t = threading.Timer(20, work)
t.start()
i = 0
while True:
    time.sleep(1)
    i+=1
    if i >1000:
        break
t.cancel()
如果事实上是这样,那么代码不起作用的原因是,当您第一次调用work函数时,它会处理,然后在最后,在新的计时器中启动另一个work函数。这种情况会一直发生,直到堆栈填满,python咳嗽,并且因为递归(从内部调用函数)太多次而生气

我的代码修复程序将计时器拉到函数外部,因此我们创建了一个计时器,它每20秒调用work函数一次


因为threading.timer在不同的线程中运行,所以我们还需要在主线程中等待。为此,我添加了一个简单的while循环,它将运行1000秒,然后关闭计时器并退出。如果我们没有在主循环中等待,它会调用您的计时器,然后立即关闭,导致python在计时器执行一次之前清理计时器。

如果没有看到错误,很难找出您做错了什么。然而,我猜您正在以一种不安全的方式访问变量,而没有锁定。这尤其是考虑到错误发生的不一致性,即代码中的竞争条件。我想你可能是对的。我忘了在声明的结尾提到我还有一个作品。我贴的东西显然没什么用,但你知道我到底想做什么。我发现的示例嵌套了它,但您发布的内容更有意义。我会像你一样运行计时器,看看会发生什么。谢谢你的帮助。你最后加的柜台是干什么的?@Randy没问题,很高兴我能帮上忙@Randy计时器是在一个单独的线程中制作的。如果我们创建了一个计时器,启动它,而这是程序中的最后一行,计时器将永远不会执行,并且会立即被清除。相反,我们需要在主循环中旋转拇指,等待线程完成其工作。这就是线程的好处。我们可以让计时器每20秒执行一次(比如轮询一个文件以获取更新),并在等待期间主要执行其他重要工作。