python定时任务无需创建文本文件防止line of code重复执行的高效方法咨询
Python定时任务通知去重的无文本文件实现方案
你当前用文本文件做标记的方案逻辑通顺,只是需要额外维护磁盘文件,以下是几种更高效、不需要手动创建文本文件的实现方式:
方案1:注册表存储(Windows平台专用)
如果脚本运行在Windows环境下,可以直接把已发送标记存在系统注册表中,读写速度远高于磁盘文件,也不会在脚本目录下生成多余可见文件。
- 写入标记示例:
import winreg # 替换为你的脚本唯一标识,避免和其他软件冲突 REG_PATH = r"Software\custom_monitor_script" key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, REG_PATH) winreg.SetValueEx(key, "alert_has_sent", 0, winreg.REG_DWORD, 1) winreg.CloseKey(key)
- 读取标记示例:
import winreg REG_PATH = r"Software\custom_monitor_script" alert_has_sent = 0 try: key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, REG_PATH, 0, winreg.KEY_READ) alert_has_sent = winreg.QueryValueEx(key, "alert_has_sent")[0] winreg.CloseKey(key) except FileNotFoundError: pass
- 状态恢复为true时直接删除对应注册表项即可清除标记。
方案2:shelve模块存储(跨平台轻量方案)
Python内置的shelve模块本质是序列化存储到本地文件,但你不需要手动处理文件的创建、读写、删除逻辑,操作方式和普通字典完全一致,比手动维护文本文件更简洁不易出错:
import shelve # 读取标记 with shelve.open("script_state_cache") as db: alert_has_sent = db.get("alert_has_sent", False) # 写入标记 with shelve.open("script_state_cache") as db: db["alert_has_sent"] = True # 状态恢复为true时清除标记 with shelve.open("script_state_cache") as db: if "alert_has_sent" in db: del db["alert_has_sent"]
方案3:本地缓存服务(高并发/多实例场景)
如果你的脚本后续需要扩展到多节点运行,或者需要更灵活的过期控制,可以部署本地Redis服务存标记,读写都是内存级操作,性能最高,还可以直接设置标记自动过期时间,避免故障长期存在时只发一次通知没人跟进的问题:
import redis # 前提是本地已经启动Redis服务 r = redis.Redis(host="127.0.0.1", port=6379, db=0, decode_responses=True) # 写入标记,可选设置24小时自动过期 r.set("alert_has_sent", "1", ex=86400) # 读取标记 alert_has_sent = r.exists("alert_has_sent") # 清除标记 r.delete("alert_has_sent")
额外建议
无论用哪种方案,都建议加一个最长发送间隔兜底:就算标记存在,只要距离上次发送通知超过你设定的阈值(比如24小时),就重新发送一次,避免异常长期存在但无人跟进的问题。
内容的提问来源于stack exchange,提问作者oss
相关产品推荐
相关产品推荐

