python threading.Timer 如何确定经过的时间?

2 投票
1 回答
1085 浏览
提问于 2025-04-18 14:01

我在一个虚拟机里做实验,这个虚拟机的系统时间会在暂停时更新。我想知道,暂停虚拟机是否会影响计时器。也就是说,计时器是用系统时间还是用实际时间来计时的?

我试着查看源代码,找到了_thread.lock.acquire,然后代码就进入了C语言部分。

下面是我的代码。我让一个子进程输出“计划”。我一直收集这些计划,直到找到最佳计划或者超过最大允许时间为止。计时器用来在时间耗尽时终止这个进程(这是我预期的情况)。我需要确认Timer不会受到系统时间更新的影响,因为这会影响我正在进行的实验。

p = Popen(args, stdout=PIPE, cwd=self.working_directory)
timer = Timer(float(self.planning_time), p.terminate)
timer.start()

plan = None
while True:
    try:
        plan = list(decode_plan_from_optic(self.decode(p.stdout), 
                    report_incomplete_plan=True))
    except IncompletePlanException:
        break
timer.cancel()

1 个回答

2

在查看*unix系统的Python源代码时,我发现Python最终会调用来自semaphore.hsem_timedwait或者来自pthread.hpthread_cond_timedwait,这取决于系统的支持情况。不管怎样,这两个函数都会使用来自time.hstruct timespec作为等待的绝对时间——timespec表示自纪元以来的秒数和纳秒数。

乍一看,Python中的等待似乎是依赖于系统时间的,这意味着我的程序会受到系统时间变化的影响。然而,time.h中定义了常量CLOCK_MONOTONIC_RAW和函数clock_gettime,如果需要一个单调递增的时钟,可以使用它。这表明有能力独立于系统时间进行等待。不过,遗憾的是,Python使用的是gettimeofday(自2008年起被标记为过时),这会受到系统时间变化的影响。

简而言之,在*unix系统中,Python的等待会受到系统时间变化的影响。

撰写回答