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.”
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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.
Method 2
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
Method 3
I have just submitted a patch to add a ScheduledTask to accomplish a small bit of time based scheduling versus period based:
https://github.com/celery/celery/commit/e8835f1052bb45a73f9404005c666f2d2b9a9228
Method 4
While @asksol’s answer still holds, the api has been updated. For celery 4.1.0, I have to import crontab and periodic_task as follows:
from celery.schedules import crontab from celery.task import periodic_task
Method 5
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.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0