python threading.Timer 如何确定经过的时间?
我在一个虚拟机里做实验,这个虚拟机的系统时间会在暂停时更新。我想知道,暂停虚拟机是否会影响计时器。也就是说,计时器是用系统时间还是用实际时间来计时的?
我试着查看源代码,找到了_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.h
的sem_timedwait
或者来自pthread.h
的pthread_cond_timedwait
,这取决于系统的支持情况。不管怎样,这两个函数都会使用来自time.h
的struct timespec
作为等待的绝对时间——timespec表示自纪元以来的秒数和纳秒数。
乍一看,Python中的等待似乎是依赖于系统时间的,这意味着我的程序会受到系统时间变化的影响。然而,time.h
中定义了常量CLOCK_MONOTONIC_RAW
和函数clock_gettime
,如果需要一个单调递增的时钟,可以使用它。这表明有能力独立于系统时间进行等待。不过,遗憾的是,Python使用的是gettimeofday
(自2008年起被标记为过时),这会受到系统时间变化的影响。
简而言之,在*unix系统中,Python的等待会受到系统时间变化的影响。