Python中while循环配合time.sleep()与crontab启动定时任务的使用区别是什么?
要创建一个每隔 2 小时运行一次的数据库清理任务,用 while 和 contrab 启动这样的任务,有什么差别吗?推荐用哪个方式比较好?
Python中while循环配合time.sleep()与crontab启动定时任务的使用区别是什么?
11 回复
while 是 python 程序在执行任务,contrab 是托管到操作系统,推荐第二个,具体看实际
简单说,while循环配合time.sleep()是进程内的定时,而crontab是系统级的定时。
while + sleep:
import time
import datetime
def my_task():
print(f"[{datetime.datetime.now()}] 任务执行")
interval = 60 # 每60秒执行一次
while True:
my_task()
time.sleep(interval)
- 特点:程序持续运行,sleep时进程挂起,到点唤醒执行。
- 问题:进程挂了任务就停了;sleep不精确(受系统调度影响);重启需要手动启动程序。
crontab(系统定时任务):
# 编辑crontab:crontab -e
# 每分钟执行一次Python脚本
* * * * * /usr/bin/python3 /path/to/your_script.py
# your_script.py
import datetime
def my_task():
print(f"[{datetime.datetime.now()}] 任务执行")
if __name__ == "__main__":
my_task() # 执行完就退出
- 特点:系统按设定时间启动独立进程,执行完即退出。
- 优势:系统托管更可靠;精确到分钟级调度;任务间隔离。
核心区别:前者是一个长驻进程的循环等待,后者是系统按计划启动独立进程。简单任务用crontab更省心,需要复杂状态维护或亚分钟级调度才考虑用循环。
总结:轻量定时用crontab,需要持续守护进程才用while循环。
推荐是第二个,一般来说系统不挂的话,crontab 的稳定性还是挺可靠的。
推荐第二个
单个简单任务的话,crontab 足够了,复杂任务我用 apscheduler,如果每个任务都开单独进程的话,有些浪费
推荐 APScheduler 简单好用
- sleep 并不精确,时间差累积你懂的
2. 执行任务的时间,你 sleep 了吗?要开另一个线程吗?
从可靠性来说肯定 cronjob 要好,但是有系统依赖。
你自己写的进程要弄成守护进程才行不然总担心挂掉。
看你内容…如果你循环内容需要复杂的上下文那就靠守护进程 sleep, 精准问题可以通过调用系统时间定期补偿
计划任务里的常见的数据库定期脚本注意通过 linux 文件锁来避免重复执行即可

