上下文
我最近发布了一个计时器类,用于审查Code Review.我有一种直觉感觉有并发错误,因为我曾经看过1单元测试失败,但无法重现失败.因此,我的代码审查发布.
我得到了一些很好的反馈,突出了代码中的各种竞争条件.(我想)我理解了问题和解决方案,但在进行任何修复之前,我想通过单元测试来暴露这些错误.当我尝试时,我意识到这很困难.各种堆栈交换答案建议我必须控制线程的执行以暴露bug,并且任何人为的时间不一定可移植到不同的机器上.这似乎是我试图解决的问题之外的许多偶然的复杂性.
相反,我尝试使用最好的静态分析(SA)工具python,PyLint,看看它是否会挑出任何错误,但它不能.为什么人类可以通过代码审查(实质上是SA)找到错误,但SA工具不能?
由于害怕尝试让Valgrind使用python(听起来像牦牛皮),我决定在修复错误时不要先复制它们.现在我在泡菜.
这是现在的代码.
from threading import Timer, Lock
from time import time
class NotRunningError(Exception): pass
class AlreadyRunningError(Exception): pass
class KitchenTimer(object):
'''
Loosely models a clockwork kitchen timer with the following differences:
You can start the timer with arbitrary duration (e.g. 1.2 seconds).
The timer calls back a given function when time's up.
Querying the time remaining has 0.1 second accuracy.
'''
PRECISION_NUM_DECIMAL_PLACES = 1
RUNNING = "RUNNING"
STOPPED = "STOPPED" …Run Code Online (Sandbox Code Playgroud)