如何使用 django 和 celery 在特定时间启动任务

how to start a task at a specific time with django & celery

我正在使用 Celery,它适用于异步,但我需要设置一个针对特定日期时间的操作。

例如"on the 30th of August, 2019, at 11:35, do this."

我的 celery.py 现在非常简单,但它有效:

import time
from datetime import datetime, timedelta
from datetime import date
from celery import shared_task,current_task, task
from celery import Celery

app = Celery()

@app.task
def test():

    print ('1')
    todaynow = datetime.now()

    print todaynow

我从视图中调用它并运行在兔子上打印

知道如何编写任务吗?

编辑:

我尝试调用 "test"

test.apply_async(eta=datetime(2019, 7, 31, 6, 28))

在 flower 中它收到任务但不执行它,为什么?

Celery 组件负责在特定时间向运行 调度任务,或者在一段时间后重复调度任务,称为 Celery Beat(调度器)。 Celery 文档有一个 complete section 描述它,详细说明如何 运行 它以及如何配置它。如果您熟悉 crontab,您将很容易创建自己的计划任务-运行s.

要安排任务,您需要使用 celery beat。

from celery.task import periodic_task 
@periodic_task(run_every=crontab(minute="*")) # It will run your task every minute
def schedule_task():
    print('1')
    todaynow = datetime.now()
    print(todaynow)

您可以使用定期任务在任何特定时间安排您的任务。 要了解更多信息,请使用此 link https://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html.

创建任务后别忘了重启你的celery beat。

您可以使用 celery 为 "the 30 of august 2019 at 11 and 35 min do this" 创建一个 单次执行的 周期性调度程序,例如:

import time
from datetime import datetime, timedelta
from datetime import date
from celery import Celery, shared_task,current_task, task
from celery.schedules import crontab

app = Celery()

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    sender.add_periodic_task(
        crontab(hour=11, minute=35, day_of_month=30, month_of_year=8),
        test.s(),
        expires=1
    )


@app.task
def test():
    print ('1')
    todaynow = datetime.now()

    print todaynow

到运行一个特定时间的任务你可以将eta参数传递给apply_async

test.apply_async(eta=datetime.datetime(2019, 8, 30, 11, 35))