You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

time.sleep()和带if判断的while循环,哪个执行效率更高?

背景

我需要每隔x分钟查询一次数据并执行各类计算,为此想到两种实现方式。我更倾向第一种,原因是若后续在中间添加耗时y的代码,仍能保证每隔x分钟执行一次;而使用time.sleep()的话,需要计算剩余时间y才能确保更新间隔始终一致。

循环方式一

import datetime
from datetime import datetime, timedelta
import time

frequency = 10/60

first_start = True
target_time = datetime.now()

while(True):
    if(target_time < datetime.now()):
        if(first_start):
            start_time = datetime.now()
            first_start = False
        else:
            start_time = end_time
        
        end_time = start_time + timedelta(minutes=frequency)
        
        target_time = end_time + timedelta(minutes=frequency)
        
        print("Start: ", start_time)
        print("End: ", end_time)
        print("Target: ", target_time)

循环方式二

first_start = True
target_time = datetime.now()

while(True):
    if(first_start):
        start_time = datetime.now()
        first_start = False
    else:
        start_time = end_time

    end_time = start_time + timedelta(minutes=frequency)

    target_time = end_time + timedelta(minutes=frequency)

    print("Start: ", start_time)
    print("End: ", end_time)
    print("Target: ", target_time)
    time.sleep(frequency*60)

问题解答

time.sleep()的实现不是后台用while循环轮询时间,它的效率要高得多。

调用time.sleep()时,操作系统会把当前进程挂起,放到等待队列中,这段时间里该进程不会占用CPU资源;直到指定的睡眠时间结束,操作系统才会唤醒进程,让它继续执行。而自己用while循环检查时间的方式,进程会持续占用CPU做无意义的轮询,严重浪费系统资源,尤其是间隔时间较长时,这种浪费会非常明显。

另外,你偏好的第一种方式可以优化:不需要额外维护target_time,每次任务执行完后直接计算下一次执行时间,再用time.sleep()等待到该时间点,这样既保证间隔精准,又能利用time.sleep()的高效性,是定时任务的常用实现方式,示例代码如下:

import datetime
from datetime import datetime, timedelta
import time

frequency = 10/60  # 间隔时间,单位:分钟
next_run_time = datetime.now()

while True:
    # 等待到下一次执行时间
    now = datetime.now()
    if now < next_run_time:
        time.sleep((next_run_time - now).total_seconds())
    
    # 执行任务
    start_time = datetime.now()
    print("Start: ", start_time)
    
    # 这里放置你的耗时任务代码
    
    # 更新下一次执行时间
    next_run_time = start_time + timedelta(minutes=frequency)

内容的提问来源于stack exchange,提问作者narnia649

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:57:21