Python无第三方依赖实现指定时间执行对应操作的函数方案咨询
实现方案
1. 定时调度核心实现(无第三方依赖)
直接用Python标准库的两种方案按需选择即可:
- 单任务/时间精度要求不高的场景:用
time模块做轻量轮询。先把传入的time参数统一转为秒级时间戳格式,循环计算当前时间和目标时间的差值,差值大于0就睡眠对应时长,到点直接触发操作。优化点:为了避免系统信号打断睡眠导致提前执行,可以把单次睡眠改为循环短睡,逻辑如下:
while time.time() < target_time: time.sleep(min(1, target_time - time.time())) - 多任务/时间精度要求高的场景:用标准库
sched事件调度模块,它本身就是基于优先级的原生时间调度实现,不需要额外依赖,直接把目标时间、执行函数、参数传入调度器即可。
2. 类Redis数据读取(无第三方驱动)
类Redis数据库基本都兼容Redis RESP通信协议,直接用标准库socket模块构造请求读取数据即可,不需要安装redis-py等第三方驱动:
- 建立TCP连接到类Redis实例的监听地址和端口
- 按照RESP协议构造认证(如果需要密码)、读取指令
- 接收返回报文后做简单解析就能拿到目标数据
示例读取代码片段:
import socket def redis_get(host: str, port: int, password: str, key: str) -> str: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) # 密码认证 if password: s.sendall(f"AUTH {password}\r\n".encode()) s.recv(1024) # 发送GET指令 s.sendall(f"GET {key}\r\n".encode()) resp = s.recv(1024).decode() s.close() # 解析RESP返回格式,$开头后接值长度,换行后为实际值 if resp.startswith("$"): return resp.split("\r\n")[1] return ""
3. 目标函数实现
参考实现逻辑如下:
import time from typing import Callable def run_at(target_time: float, operation: Callable, redis_conf: dict): # target_time为秒级时间戳,若传入的是datetime对象可提前用.timestamp()转为时间戳 # 等待到目标时间 while time.time() < target_time: time.sleep(min(1, target_time - time.time())) # 到点后先读Redis数据,再执行传入的operation redis_data = redis_get(**redis_conf, key="你需要读取的key名") operation(redis_data)
4. 服务器后台驻留方案
如果需要脚本长期运行在服务器后台,不需要额外进程管理框架的话:
- Linux环境直接用
nohup python 你的脚本名.py &命令启动,输出会自动存入nohup.out日志 - 可以在脚本外层加简单的异常捕获和重试逻辑,避免单次异常导致进程退出
内容的提问来源于stack exchange,提问作者Sadra
相关产品推荐
相关产品推荐

