Python中如何实现Celery在指定时间段内执行秒级任务

cdlery 如设在工作日朝九晚五时间段内,每 30 秒执行一次任务?


Python中如何实现Celery在指定时间段内执行秒级任务
12 回复

都 30 秒了。自己写个 sleep 吧。不要 celery 了。


在Celery里实现秒级定时任务,用crontab不够精确,得用beat_schedule配合秒级间隔。下面是个完整示例:

# tasks.py
from celery import Celery
from datetime import datetime, timedelta

app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def my_secondly_task():
    print(f"秒级任务执行于: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

# 配置秒级定时
app.conf.update(
    beat_schedule={
        'run-every-10-seconds': {
            'task': 'tasks.my_secondly_task',
            'schedule': 10.0,  # 每10秒执行一次
            'args': (),
            'kwargs': {},
            'options': {'queue': 'default'},
        },
    },
    timezone='Asia/Shanghai',
)

启动命令:

# 启动worker
celery -A tasks worker --loglevel=info

# 启动beat调度器
celery -A tasks beat --loglevel=info

关键点:

  1. schedule参数直接传浮点数(秒数)就能实现秒级调度
  2. 用Redis做broker响应更快
  3. 记得同时启动worker和beat进程

要指定时间段执行的话,可以在任务函数里加时间判断:

@app.task
def my_time_window_task():
    now = datetime.now().time()
    start = datetime.strptime("09:00:00", "%H:%M:%S").time()
    end = datetime.strptime("17:00:00", "%H:%M:%S").time()
    
    if start <= now <= end:
        print(f"在指定时间段内执行: {now}")

schedule参数设置秒数最直接。

间隔太短了么?

简单的固定时间固定任务话内部用 rpc 就好了,触发然后执行,写个异步线程就行了。while true 非常可靠,没必要 Celery 高射炮打蚊子。一般我都是遇到大的项目才用 Celery 配合 Airflow.

可以了解一下 apscheduler

可以看看 celery beat

apscheduler

celery beat,schedule

记得 celery 自带 cron 的组建吧。。

celery beat add_periodic_task 或 linux crontab

cron 的组件最小单位似乎是分

回到顶部