【问题标题】:How to delay a function call counting the execution time of the function itself如何延迟函数调用计算函数本身的执行时间
【发布时间】:2026-02-06 04:20:05
【问题描述】:

我正在尝试在指定的时间后完全循环一个特定的函数。 我考虑过为此使用 time.sleep(),但是 time 模块不计算函数本身的运行时间。
例如:

def function(*args, **kwargs):
   ## Some processing happens here that takes 0.9 seconds
   time.sleep(1)

这个函数需要 1.9 秒来执行。但是,我希望它每秒执行一次,包括运行该函数所花费的时间。
我不知道函数内的确切处理时间;可能需要 0.9、0.92、0.88、... 秒,所以我不能简单地使用 time.sleep(0.1)

我可以对函数计时并从睡眠时间中减去它,如下所示:

def function(*args, **kwargs):
   start = time.time()
   ## Some processing happens here that takes 0.9 seconds
   end = time.time()
   sleep_time = 1 - (end-start)
   time.sleep(sleep_time)

但是,对代码进行计时和做减法本身并不需要处理时间,这意味着整个函数需要 1 秒多一点,一段时间后调度会不正确?

这似乎是我可以使用 Threading 完成的事情,但是我一直都知道,除非你绝对需要它来加速运行时,否则不应包含线程,而在我的情况下它不会......

有什么想法吗?

【问题讨论】:

    标签: python multithreading time


    【解决方案1】:

    你的意思是这样的:

    def do_work():
        print("I am working")
    
    def work_loop():
        while True:
            do_work()
            time.sleep(1)
    

    这样,您的“do_work()”函数每 1 秒执行一次,加上 do_work() 函数完成其工作所需的任何时间。

    或者你想每 1 秒运行一次你的函数,所以如果 do_work() 需要 0.9 秒才能完成,你想在 0.1 秒后重新启动它?

    您可以通过以下方式检查时间来做到这一点:

    def do_work():
        finish_time = int(time.time()) + 1
        # do your calculations in here
        while int(time.time()) < finish_time:
            time.sleep(0.001)
        return
    

    我肯定会建议您使用 asyncio 来满足这种要求。否则你的程序会在等待时阻塞。

    【讨论】:

    • 您的第二个代码示例确实是我想做的解决方案,谢谢。不知道为什么我自己没有想到它......这似乎是一个常见的问题,虽然我期望一些内置功能或自定义包可以在不使用 while 循环的情况下处理这个问题
    • 我忘了一件事,如果你想让你的 do_work() 花费大约。 1 秒,你不应该调用 int(time.time())。因为这会导致你的 do_work() 函数运行不到 1 秒。只需执行 time.time() + 1。
    • 第二个答案有效,但是 int(time.time())