我正在虚拟机中运行一些实验,如果它被暂停,系统时间会更新。我想知道我是否可以暂停虚拟机而不影响计时器。也就是说,Timer是否使用系统时间或挂壁时间?
我已经尝试查看源代码并在代码插入C之前到达_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()
答案 0 :(得分:1)
在检查了* unix it系统的python源代码后,我发现python最终会从sem_timedwait
semaphore.h
或pthread_cond_timedwait
委托给pthread.h
,具体取决于支持。无论哪种方式,两个函数都从struct timespec
获取time.h
作为绝对时间等待 - timespec是自纪元以来的秒数和纳秒数。
所以从表面看来,在python中等待依赖于系统时间 - 这意味着我的程序将受到系统时间变化的影响。但是,time.h
指定常量CLOCK_MONOTONIC_RAW
和函数clock_gettime
,如果需要单调递增时钟。显示有能力独立于系统时间等待。然而,遗憾的是python使用gettimeofday
(自2008年起标记为过时),这受到系统时间变化的影响。
简而言之,在* unix系统上等待python会受到系统时间变化的影响。