【问题标题】:How to invoke a function at an exactly given time point in Python?如何在 Python 中精确给定的时间点调用函数?
【发布时间】:2013-05-22 08:37:03
【问题描述】:

如何在 Python 中的某个特定时间点调用函数?

例如:

import time
def foo():
    print time.time()

start_time = time.time()
expected_time_to_run_foo = start_time + 12.3456
#invoke foo

如何让函数foo打印给定值expected_time_to_run_foo

P.S.:我不确定time.sleep() 是否有效。我需要更精确。

【问题讨论】:

  • time.sleep(12.3456)?更精确。除非你有一个实时操作系统,否则你获得它的准确度会有限制——当然不会低到 100 微秒。
  • 是的。因为fooprint之前可能需要时间自己运行,所以恐怕time.sleep()不够精确。
  • 查看这里了解更多信息:stackoverflow.com/questions/1938048/…
  • 我会看看一些基于事件的库(celery、gevent),它们比睡眠更可靠。但我怀疑会找到比秒更精确的东西。
  • 所以安排调用使用 start_time 作为绝对参考

标签: python time


【解决方案1】:

内置的 sched 模块可让您安排未来的活动。 (这里所有的代码都是 Python 3)。

import sched
import time

def print_something(x):
    print(x)

s = sched.scheduler()

s.enter(1, 0, print_something, ['first'])
s.enter(2, 0, print_something, ['second'])
s.run()

您可以提供自己的函数来获取当前时间并等到未来的指定时间。默认值为 time.monotonic(time.time 的调整版本)和 time.sleep。

您可以使用忙碌等待来稍微提高准确性,如下所示:

import sched
import time

def print_something(x):
    print(x)

def busy_wait(target):
    while time.monotonic() < target:
        pass

s = sched.scheduler(delayfunc=busy_wait)

s.enter(1, 0, print_something, ['first'])
s.enter(2, 0, print_something, ['second'])
s.run()

但是,实际上,桌面操作系统中有很多意外延迟的来源,如果您的时间限制如此严格,那么如果没有实时操作系统,您将永远无法获得可接受的结果。

【讨论】:

  • 谢谢。有用。单个错误是可以接受的。我只是担心这种方法不会发生的累积错误。
猜你喜欢
  • 2019-07-14
  • 1970-01-01
  • 2022-11-15
  • 2022-01-08
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多