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

Python datetime模块计时器异常:添加打印语句后循环未终止

问题原因

核心问题是datetime.now() == endTime的判断逻辑过于苛刻:datetime.now()返回的时间精确到微秒,当没有print语句时,循环每秒会执行数百万次,有很大概率刚好命中endTime的那个微秒点;但加上print后,每次循环都要输出内容,耗时变长,循环执行间隔变大,几乎不可能刚好等于endTime,导致循环无法终止,甚至当前时间超过endTime后,剩余时间计算为负数。

优化方案

方案1:修改判断逻辑(基于原代码调整)

把相等判断改成大于等于,即使错过精确时刻,也能在时间到了之后终止循环,同时保留剩余时间打印:

# Creating a timer
from datetime import timedelta, datetime

try:
    secondsTicker = int(input("Enter the number of seconds to wait: "))
except:
    print("Invalid value !... Defaulting to 5 seconds")
    secondsTicker = 5
    
timeShift = timedelta(seconds=secondsTicker)
currentTime = datetime.now()
endTime = currentTime + timeShift

while True:
    now = datetime.now()
    if now >= endTime:
        print(f"{timeShift} has passed since {currentTime} and is now {endTime}")
        break
    remaining = (endTime - now).total_seconds()
    print(f"Remaining time: {remaining:.2f} seconds")

方案2:使用time模块(更高效的实现)

用time.sleep()代替空循环,避免CPU空转,这是实现计时器更推荐的方式:

import time

try:
    secondsTicker = int(input("Enter the number of seconds to wait: "))
except:
    print("Invalid value !... Defaulting to 5 seconds")
    secondsTicker = 5

current_time = time.strftime("%Y-%m-%d %H:%M:%S")
print(f"Timer started at {current_time}, waiting {secondsTicker} seconds...")

# 行内刷新显示倒计时
for i in range(secondsTicker, 0, -1):
    print(f"Remaining: {i} seconds", end="\r")
    time.sleep(1)

end_time = time.strftime("%Y-%m-%d %H:%M:%S")
print(f"\n{secondsTicker} seconds has passed since {current_time}, current time is {end_time}")

这个方案的优势:

  • 不会占用大量CPU资源(空循环会让单个CPU核心跑满)
  • 倒计时显示更友好,同一行刷新不刷屏
  • 逻辑简单,不容易出现时间判断误差

方案3:使用threading.Timer(非阻塞式计时器)

如果需要计时器运行的同时执行其他任务,可以用线程计时器实现后台计时:

import threading
import time

def timer_callback():
    print("\nTime's up!")

try:
    secondsTicker = int(input("Enter the number of seconds to wait: "))
except:
    print("Invalid value !... Defaulting to 5 seconds")
    secondsTicker = 5

current_time = time.strftime("%Y-%m-%d %H:%M:%S")
print(f"Timer started at {current_time}, will trigger after {secondsTicker} seconds")

# 创建并启动后台计时器
timer = threading.Timer(secondsTicker, timer_callback)
timer.start()

# 主线程可以并行执行其他任务
while timer.is_alive():
    print("Doing other tasks...", end="\r")
    time.sleep(0.5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:34:50