Python后台定时执行代码:个人助手提醒功能实现方案咨询
嘿,这个需求太常见啦!用Python的threading模块就能完美解决你的问题——每个提醒单独开一个子线程去处理等待和触发,主线程就能继续接收用户的其他指令,完全不会被阻塞。我给你捋清楚具体实现思路和代码示例:
核心思路
每个提醒本质上是“等待指定时间后执行某个动作”,我们把这个逻辑放到子线程里:
- 主线程负责接收用户输入、解析提醒时间和内容;
- 为每个提醒创建一个子线程,子线程计算当前时间到提醒时间的等待时长,用
time.sleep()等待(但因为在子线程,不会卡主程序); - 时间到了,子线程触发提醒(打印、弹窗都可以);
- 主线程全程可以处理新的输入,比如设置另一个提醒、查天气。
完整代码示例
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()
关键细节说明
- 守护线程(daemon=True):设置这个参数后,如果用户输入“退出”关闭主线程,所有正在等待的提醒子线程会自动终止,不会留在后台占用资源。
- 时间解析优化:示例里的时间解析比较简单,如果你想支持更复杂的时间(比如“明天早上8点”、“下周三下午3点”),可以用
dateparser库,一行代码就能搞定智能时间解析:import dateparser reminder_time = dateparser.parse(time_str, settings={"RELATIVE_BASE": datetime.now()}) - 提醒方式扩展:示例用
print()触发提醒,你可以换成系统通知(比如用plyer库的notification.notify())、弹窗,甚至发送邮件/短信。
测试场景
- 输入“提醒我下午5点洗碗”,程序会确认提醒已设置,然后你可以立刻输入“提醒我10分钟后喝水”,两个提醒会分别在指定时间触发,中间完全不影响你输入其他指令。
- 输入“查天气”,主线程会直接返回结果,不会被正在等待的提醒线程阻塞。
这样整个逻辑就通了,你可以根据自己的需求继续扩展功能~
内容的提问来源于stack exchange,提问作者Aetherdestroyer
相关产品推荐
相关产品推荐

