Python setInterval设置5秒定时打印失效 实际间隔1秒问题求解
问题原因
定时间隔不生效是两个逻辑错误导致的:
- 你把
detection函数定义、调用、Timer启动逻辑全写在了遍历检测框的for循环内部。视频检测的帧循环本身是高频运行的(常规每秒10~30帧),每遍历一个检测框就会新建一个独立的Timer线程,短时间内会启动几十上百个定时任务,根本不是单任务按固定间隔执行的逻辑。 - 你在循环里同步调用
detection()获取绘图用的label和color,这个调用是立刻执行的,不会等待5秒延时,再加上多线程重复触发,打印间隔自然远小于设定值。
修复方案
优先选择时间戳判断方案,没有多线程竞争问题,适配视频检测这类高频循环场景,稳定性远高于多线程Timer:
import time import cv2 # 配置参数 PRINT_INTERVAL = 5 # 打印间隔,单位:秒 last_print_ts = 0 # 上次打印的时间戳,初始为0则首次检测到结果立刻打印,如需延后首次打印可设为time.time() # 视频流读取主循环 # cap = cv2.VideoCapture(0) while True: # 保留原有读帧、口罩检测逻辑 # ret, frame = cap.read() # locs, preds = mask_detector.detect(frame) for (box, pred) in zip(locs, preds): (startX, startY, endX, endY) = box mask_conf, no_mask_conf = pred # 判定当前检测结果 if mask_conf > no_mask_conf: label = "Mask" color = (0, 255, 0) else: label = "No Mask" color = (0, 0, 255) # 达到时间间隔才打印,避免高频输出 current_ts = time.time() if current_ts - last_print_ts >= PRINT_INTERVAL: print(label) last_print_ts = current_ts # 绘图逻辑不受影响,每帧正常更新画面 cv2.putText(frame, label, (startX, startY - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2) cv2.rectangle(frame, (startX, startY), (endX, endY), color, 2) # 保留原有画面显示、退出逻辑 # cv2.imshow("Mask Detection", frame) # if cv2.waitKey(1) & 0xFF == ord('q'): # break
如果一定要用Timer实现,注意Timer只能在帧循环外启动一次,不要在遍历检测框的循环里重复创建线程,单独维护全局变量存储最新检测结果即可:
import cv2 from threading import Timer PRINT_INTERVAL = 5 latest_label = "" def interval_print(): global latest_label if latest_label: print(latest_label) Timer(PRINT_INTERVAL, interval_print).start() # 全局只启动一次定时打印任务 interval_print() # 后续帧检测主循环逻辑和前述一致,循环内仅更新latest_label的值,不要重复启动新Timer
提示:视频检测场景不推荐Timer方案,多线程访问共享变量如果不加锁容易出现值不一致问题;时间戳方案单线程运行,无额外开销,间隔精度完全满足业务需求。
内容的提问来源于stack exchange,提问作者Ilyas Adiyasa
相关产品推荐
相关产品推荐

