You need to enable JavaScript to run this app. python定时任务无需创建文本文件防止line of code重复执行的高效方法咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 21:36:03