繁体   English   中英

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

[英]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_timedwaitpthread.h委托给了pthread_cond_timedwait 无论哪种方式,这两个函数struct timespectime.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM