views:

420

answers:

4

I've looked into PeriodicTask, but the examples only cover making it recur. I'm looking for something more like cron's ability to say "execute this task every Monday at 1 a.m."

+2  A: 

Use

YourTask.apply_async(args=[some, args, here], eta=when)

And at the end of your task, reschedule it to the next time it should run.

nosklo
don't forget eta is a python's datetime,
diegueus9
If I make it a `PeriodicTask`, I only need to schedule it the first time, right?
Hank Gay
A: 

How you can read in this tutorial, you can make a PeriodicTask, i think if you have execute a task at 1 .am. Monday's morning is because you wan to run a long cpu/mem operation, rememeber celery use ampq for enqueue tasks.

diegueus9
+2  A: 

The recently released version 1.0.3 supports this now, thanks to Patrick Altman!

Example:

from celery.task.schedules import crontab
from celery.decorators import periodic_task

@periodic_task(run_every=crontab(hour=7, minute=30, day_of_week="mon"))
def every_monday_morning():
    print("This runs every Monday morning at 7:30a.m.")

See the changelog for more information:

http://celeryproject.org/docs/changelog.html

asksol
+1  A: 

I have just submitted a patch to add a ScheduledTask to accomplish a small bit of time based scheduling versus period based:

http://github.com/paltman/celery/compare/scheduled-periodic-task

Patrick Altman