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
相关产品推荐
相关产品推荐

