Celery, run task once at a specified time

前端 未结 2 846
忘掉有多难
忘掉有多难 2020-12-16 02:28

How can I run a celery task at a given time, but only once?

I read the documentation and couldn\'t find any example of this.

相关标签:
2条回答
  • 2020-12-16 03:16

    If you insist on using Celery

    To run a task at a specified time, in Celery you would normally use a periodic task, which conventionally is a recurring task.

    However, you may create a periodic task with a very specific schedule and condition that happens only once so effectively it runs only once.

    Unfortunately we can only specify so much, e.g. we can specify hour, minute, day_of_month and month_of_year but we can't specify year

    However with that, your task would run at most 1 time for per year, so below are some workarounds:

    Unschedule it after it is ran

    It should be relatively easy to unschedule it once it is ran (you have 1 year to do so!)

    Use a "DONE" flag when the task completes

    With a flag written somewhere (disk or DB), you can first check if the task has run before or not, i.e. if done: exit

    Exit if not proper year or you want to be safe, just add code into the task that checks the year, e.g. if year != 2017: exit.

    Simple cron/Os level scheduler works too

    You may also skip Celery altogether and use some OS level facility like cron for UNIX-like systems, more on that here.

    The general idea remains the same.

    0 讨论(0)
  • 2020-12-16 03:25

    You can use parameter eta when calling the task. Example:

    from datetime import datetime, timedelta
    
    @app.task()
    def hello(self):
        return 'hello world'
    
    
    tomorrow = datetime.utcnow() + timedelta(days=1)
    hello.apply_async(eta=tomorrow)
    

    Documentation: http://docs.celeryproject.org/en/latest/userguide/calling.html#eta-and-countdown

    Alternatively, when you want to call hello multiple times and to be sure it is executed only one at the time, you can use locking - more about it in the documentation: http://docs.celeryproject.org/en/latest/tutorials/task-cookbook.html#ensuring-a-task-is-only-executed-one-at-a-time

    0 讨论(0)
提交回复
热议问题