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

Python后台定时执行代码:个人助手提醒功能实现方案咨询

嘿,这个需求太常见啦!用Python的threading模块就能完美解决你的问题——每个提醒单独开一个子线程去处理等待和触发,主线程就能继续接收用户的其他指令,完全不会被阻塞。我给你捋清楚具体实现思路和代码示例:

核心思路

每个提醒本质上是“等待指定时间后执行某个动作”,我们把这个逻辑放到子线程里:

  1. 主线程负责接收用户输入、解析提醒时间和内容;
  2. 为每个提醒创建一个子线程,子线程计算当前时间到提醒时间的等待时长,用time.sleep()等待(但因为在子线程,不会卡主程序);
  3. 时间到了,子线程触发提醒(打印、弹窗都可以);
  4. 主线程全程可以处理新的输入,比如设置另一个提醒、查天气。
完整代码示例
import threading
import time
from datetime import datetime, timedelta

def set_reminder(reminder_time, content):
    """子线程执行的提醒函数"""
    now = datetime.now()
    delay = (reminder_time - now).total_seconds()
    
    if delay <= 0:
        print("\n⚠️ 提醒时间不能早于当前时间哦!")
        return
    
    # 这里的sleep在子线程,完全不影响主线程
    time.sleep(delay)
    # 触发提醒,你可以换成系统通知、弹窗等
    print(f"\n📢 【提醒】{content}")

def main():
    print("🤖 欢迎使用个人助手!输入'退出'结束程序~")
    while True:
        user_input = input("\n请输入指令:").strip()
        
        if user_input.lower() == "退出":
            print("👋 程序结束,再见!")
            break
        
        # 处理提醒指令
        if user_input.startswith("提醒我"):
            try:
                # 简单解析输入(可以根据需求优化,比如支持更复杂的时间)
                # 示例支持:"提醒我下午5点洗碗"、"提醒我10分钟后喝水"
                if "分钟后" in user_input:
                    # 处理相对时间
                    parts = user_input.split("分钟后")
                    minutes = int(parts[0].replace("提醒我", "").strip())
                    content = parts[1].strip() if len(parts) > 1 else "未指定内容"
                    reminder_time = datetime.now() + timedelta(minutes=minutes)
                else:
                    # 处理当天的绝对时间(上午/下午X点)
                    time_part, content = user_input[3:].split("做", 1)
                    time_str = time_part.strip()
                    content = content.strip()
                    
                    # 转换为24小时制时间
                    if "下午" in time_str:
                        hour = int(time_str.replace("下午", "").strip().split("点")[0]) + 12
                        reminder_time = datetime.now().replace(hour=hour, minute=0, second=0, microsecond=0)
                    else:
                        hour = int(time_str.replace("上午", "").strip().split("点")[0])
                        reminder_time = datetime.now().replace(hour=hour, minute=0, second=0, microsecond=0)
                
                # 创建并启动守护线程
                reminder_thread = threading.Thread(
                    target=set_reminder,
                    args=(reminder_time, content),
                    daemon=True  # 主线程退出时,子线程自动结束
                )
                reminder_thread.start()
                
                print(f"✅ 已设置提醒:{content} | 时间:{reminder_time.strftime('%Y-%m-%d %H:%M')}")
            except Exception as e:
                print(f"❌ 解析指令出错啦:{str(e)},请试试这种格式:'提醒我下午5点洗碗'")
        else:
            # 处理其他指令(比如查天气)
            print(f"🔍 正在处理指令:{user_input}")
            # 这里可以替换成真实的天气查询逻辑
            print("🌤️ 今天天气晴,气温26℃,适合出门!")

if __name__ == "__main__":
    main()
关键细节说明
  1. 守护线程(daemon=True):设置这个参数后,如果用户输入“退出”关闭主线程,所有正在等待的提醒子线程会自动终止,不会留在后台占用资源。
  2. 时间解析优化:示例里的时间解析比较简单,如果你想支持更复杂的时间(比如“明天早上8点”、“下周三下午3点”),可以用dateparser库,一行代码就能搞定智能时间解析:
    import dateparser
    reminder_time = dateparser.parse(time_str, settings={"RELATIVE_BASE": datetime.now()})
    
  3. 提醒方式扩展:示例用print()触发提醒,你可以换成系统通知(比如用plyer库的notification.notify())、弹窗,甚至发送邮件/短信。
测试场景
  • 输入“提醒我下午5点洗碗”,程序会确认提醒已设置,然后你可以立刻输入“提醒我10分钟后喝水”,两个提醒会分别在指定时间触发,中间完全不影响你输入其他指令。
  • 输入“查天气”,主线程会直接返回结果,不会被正在等待的提醒线程阻塞。

这样整个逻辑就通了,你可以根据自己的需求继续扩展功能~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:46:55