[英]How does python threading.Timer determine elapsed time?
我正在虚拟机中进行一些实验,如果该虚拟机处于暂停状态,则会更新其系统时间。 我想知道是否可以挂起虚拟机并且不影响计时器。 也就是说,Timer使用系统时间还是墙上时间?
我尝试遍历源代码并在代码浸入C _thread.lock.acquire
之前进入_thread.lock.acquire
。
下面是我的代码。 我委托给输出“计划”的子流程。 我一直在收集这些计划,直到找到最佳计划或最长允许时间过去为止。 如果时间用完(这是预期的事务状态),则使用计时器终止进程。 我需要知道, 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()
通过检查* unix it系统的python源代码,我发现python最终取决于支持将semaphore.h
委托给sem_timedwait
或pthread.h
委托给了pthread_cond_timedwait
。 无论哪种方式,这两个函数struct timespec
从time.h
获取struct timespec
作为等待直到的绝对时间-timespec是距该纪元以来的秒数和纳秒数。
因此,从表面上看来,在python中等待取决于系统时间-这意味着我的程序将受到系统时间变化的影响。 但是,如果需要单调递增的时钟,则time.h
指定常量CLOCK_MONOTONIC_RAW
和函数clock_gettime
。 显示有一种独立于系统时间进行等待的能力。 但是,可悲的是,python使用的gettimeofday
(自2008年以来已过时)已受到系统时间更改的影响。
简而言之,* unix系统上的python等待会受系统时间的更改影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.