Python中cron表达式的支持真的不是很好吗?

公司需要使用定时任务,要求必须能输入标准的 cron 表达式,看了很多框架,都不支持标准的 6,7 位 cron 表达式,croniter,crontab,apscheduler 都是只支持 5 位的 cron 表达式。 问问各位大佬,这个需求能否实现?


Python中cron表达式的支持真的不是很好吗?
7 回复

需求说一下啊 有什么特殊需求吗


Python对cron表达式的原生支持确实比较有限,但通过第三方库完全可以很好地解决这个问题。

标准库的sched模块功能基础,不适合复杂定时任务。真正好用的是这些第三方库:

1. APScheduler 最推荐的生产级选择,支持多种触发器:

from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

# 每天10:30执行
@sched.scheduled_job('cron', hour=10, minute=30)
def job1():
    print("每天10:30执行")

# 更复杂的cron表达式
@sched.scheduled_job('cron', day_of_week='mon-fri', hour='9-17')
def job2():
    print("工作日9点到17点执行")

sched.start()

2. Celery Beat(配合Celery使用) 适合分布式任务队列场景:

from celery import Celery
from celery.schedules import crontab

app = Celery('tasks')

app.conf.beat_schedule = {
    'every-monday-morning': {
        'task': 'tasks.send_weekly_report',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
    },
}

3. schedule库 轻量级选择,语法更Pythonic:

import schedule
import time

schedule.every().day.at("10:30").do(job)
schedule.every().monday.at("09:00").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

4. croniter 专门解析cron表达式的库:

from croniter import croniter
from datetime import datetime

base_time = datetime.now()
cron = croniter("0 9 * * 1-5", base_time)  # 工作日9点
next_time = cron.get_next(datetime)

总结建议:根据项目需求选择合适的库,APScheduler通常是最全面的选择。

apscheduler:
class apscheduler.triggers.cron.CronTrigger(year=None, month=None, day=None, week=None, day_of_week=None, hour=None, minute=None, second=None, start_date=None, end_date=None, timezone=None, jitter=None)

second minute hour day_of_week day month week year 这还不够用的吗?

很简单,输入‘ 0 15 10 ? * 6L ’这种类型的表达式,获取下次执行的日期时间

需要的是表达式这种形式,例如’0 15 10 ? * 6L’

要不自己写一个适配器开源出来阿。:doge:

你都有表达式了,按空格 split 一下填到对应项不就完事了?

回到顶部