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

时间:2014-07-20 10:00:03

标签: python timer python-3.4

我正在虚拟机中运行一些实验,如果它被暂停,系统时间会更新。我想知道我是否可以暂停虚拟机而不影响计时器。也就是说,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()

1 个答案:

答案 0 :(得分:1)

在检查了* unix it系统的python源代码后,我发现python最终会从sem_timedwait semaphore.hpthread_cond_timedwait委托给pthread.h,具体取决于支持。无论哪种方式,两个函数都从struct timespec获取time.h作为绝对时间等待 - timespec是自纪元以来的秒数和纳秒数。

所以从表面看来,在python中等待依赖于系统时间 - 这意味着我的程序将受到系统时间变化的影响。但是,time.h指定常量CLOCK_MONOTONIC_RAW和函数clock_gettime,如果需要单调递增时钟。显示有能力独立于系统时间等待。然而,遗憾的是python使用gettimeofday(自2008年起标记为过时),这受到系统时间变化的影响。

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