Bird
Raised Fist0
Djangoframework~5 mins

Periodic tasks with Celery Beat in Django - Cheat Sheet & Quick Revision

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is Celery Beat in Django?
Celery Beat is a scheduler that kicks off tasks at regular intervals, like a clock. It works with Celery to run periodic tasks automatically.
Click to reveal answer
beginner
How do you define a periodic task using Celery Beat?
You define a periodic task by adding it to the Celery Beat schedule, specifying the task name and how often it should run (e.g., every 10 minutes).
Click to reveal answer
intermediate
What is the role of the 'celery.py' file in setting up Celery Beat?
The 'celery.py' file configures Celery for your Django project, including setting up the broker and backend. The Beat scheduler is typically started as a separate process.
Click to reveal answer
beginner
Why is it important to run both Celery worker and Celery Beat processes?
Celery worker runs the tasks, while Celery Beat schedules when tasks should run. Both are needed for periodic tasks to work properly.
Click to reveal answer
advanced
How can you ensure your periodic tasks are reliable and do not overlap?
Use task locking or set task time limits to prevent overlap. Also, configure Celery Beat to use a persistent scheduler to keep track of tasks.
Click to reveal answer
What does Celery Beat do in a Django project?
AManages database migrations
BProcesses tasks immediately
CStores task results
DSchedules tasks to run periodically
Which command starts the Celery Beat scheduler?
Acelery -A proj worker
Bpython manage.py runserver
Ccelery -A proj beat
Dcelery -A proj migrate
Where do you define the schedule for periodic tasks in Celery Beat?
AIn the Celery app configuration
BIn Django models.py
CIn the database migrations
DIn the Django settings.py only
What happens if you run only the Celery worker without Celery Beat for periodic tasks?
ATasks will run twice
BPeriodic tasks will not be scheduled
CThe worker will crash
DTasks will run automatically
How can you prevent a periodic task from running multiple times at once?
AUse task locking or time limits
BRun multiple Celery workers
CRestart Celery Beat frequently
DUse Django signals
Explain how Celery Beat works with Celery to run periodic tasks in Django.
Think about the roles of scheduler and worker.
You got /4 concepts.
    Describe the steps to set up a periodic task using Celery Beat in a Django project.
    Start from configuration to running processes.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of Celery Beat in a Django project?
      easy
      A. To schedule and run periodic tasks automatically
      B. To handle HTTP requests asynchronously
      C. To manage database migrations
      D. To serve static files efficiently

      Solution

      1. Step 1: Understand Celery Beat's role

        Celery Beat is designed to schedule tasks to run at specific times or intervals automatically.
      2. Step 2: Differentiate from other components

        Handling HTTP requests, managing migrations, or serving static files are not functions of Celery Beat.
      3. Final Answer:

        To schedule and run periodic tasks automatically -> Option A
      4. Quick Check:

        Celery Beat = periodic task scheduler [OK]
      Hint: Celery Beat schedules tasks, not handles requests [OK]
      Common Mistakes:
      • Confusing Celery Beat with Django's request handling
      • Thinking Celery Beat manages database or static files
      • Assuming Celery Beat runs tasks immediately without schedule
      2. Which of the following is the correct way to define a periodic task schedule using Celery Beat with a crontab in Django settings?
      easy
      A. "beat_schedule = { 'task-name': { 'task': 'app.tasks.my_task', 'schedule': crontab(minute='0', hour='*/3') } }"
      B. "beat_schedule = { 'task-name': { 'task': 'app.tasks.my_task', 'schedule': crontab('0', '*/3') } }"
      C. "beat_schedule = { 'task-name': { 'task': 'app.tasks.my_task', 'schedule': crontab(minute=0, hour='every 3 hours') } }"
      D. "beat_schedule = { 'task-name': { 'task': 'app.tasks.my_task', 'schedule': crontab(minute='0', hour='3/0') } }"

      Solution

      1. Step 1: Check crontab syntax

        The crontab function requires named arguments like minute and hour with string values representing schedule patterns.
      2. Step 2: Validate correct usage

        "beat_schedule = { 'task-name': { 'task': 'app.tasks.my_task', 'schedule': crontab(minute='0', hour='*/3') } }" correctly uses crontab(minute='0', hour='*/3') to run every 3 hours at minute 0.
      3. Final Answer:

        beat_schedule with crontab(minute='0', hour='*/3') -> Option A
      4. Quick Check:

        Correct crontab syntax = "beat_schedule = { 'task-name': { 'task': 'app.tasks.my_task', 'schedule': crontab(minute='0', hour='*/3') } }" [OK]
      Hint: Use named args with strings in crontab() [OK]
      Common Mistakes:
      • Passing positional arguments instead of named
      • Using invalid hour format like '3/0'
      • Mixing string and integer types incorrectly
      3. Given this Celery Beat schedule snippet in Django settings:
      beat_schedule = {
        'print-time': {
          'task': 'app.tasks.print_time',
          'schedule': crontab(minute='*/15')
        }
      }
      What will happen when Celery Beat and worker run?
      medium
      A. The task will not run due to syntax error
      B. The task runs only once at minute 15
      C. The task runs every hour at minute 0
      D. The task 'print_time' runs every 15 minutes

      Solution

      1. Step 1: Interpret crontab(minute='*/15')

        This means the task runs every 15 minutes, at minute 0, 15, 30, 45 of each hour.
      2. Step 2: Understand Celery Beat behavior

        When both Beat and worker run, Beat triggers the task on schedule, so it runs repeatedly every 15 minutes.
      3. Final Answer:

        The task 'print_time' runs every 15 minutes -> Option D
      4. Quick Check:

        crontab '*/15' means every 15 minutes [OK]
      Hint: */15 in crontab means every 15 minutes [OK]
      Common Mistakes:
      • Thinking it runs only once
      • Confusing minute '*/15' with fixed minute 15
      • Assuming syntax error without checking carefully
      4. You defined this schedule in your Django settings:
      beat_schedule = {
        'cleanup-task': {
          'task': 'app.tasks.cleanup',
          'schedule': crontab(minute=0, hour='*')
        }
      }
      But the task never runs. What is the most likely cause?
      medium
      A. The task name 'cleanup-task' is invalid
      B. You forgot to start the Celery Beat service
      C. The crontab syntax is incorrect because minute should be a string
      D. The worker must be restarted every hour

      Solution

      1. Step 1: Check if Celery Beat is running

        Celery Beat must be running to send scheduled tasks to the worker.
      2. Step 2: Validate other options

        Task names can be any string, crontab accepts integer or string for minute, and workers do not need hourly restart.
      3. Final Answer:

        You forgot to start the Celery Beat service -> Option B
      4. Quick Check:

        Beat service must run for schedules to trigger [OK]
      Hint: Always run Celery Beat alongside worker [OK]
      Common Mistakes:
      • Assuming task name format causes failure
      • Thinking crontab minute must be string only
      • Restarting worker unnecessarily
      5. You want to run a Django Celery task every day at 2:30 AM and also every 10 minutes. How should you configure beat_schedule to achieve this?
      hard
      A. { 'daily-task': { 'task': 'app.tasks.daily', 'schedule': crontab(hour='2:30') }, 'frequent-task': { 'task': 'app.tasks.frequent', 'schedule': crontab(minute=10) } }
      B. { 'daily-task': { 'task': 'app.tasks.daily', 'schedule': crontab(hour=2, minute=30) }, 'frequent-task': { 'task': 'app.tasks.frequent', 'schedule': crontab(minute=10) } }
      C. { 'daily-task': { 'task': 'app.tasks.daily', 'schedule': crontab(hour=2, minute=30) }, 'frequent-task': { 'task': 'app.tasks.frequent', 'schedule': crontab(minute='*/10') } }
      D. { 'daily-task': { 'task': 'app.tasks.daily', 'schedule': crontab(hour='2', minute='30') }, 'frequent-task': { 'task': 'app.tasks.frequent', 'schedule': crontab(minute='10') } }

      Solution

      1. Step 1: Define daily task schedule correctly

        Use crontab(hour=2, minute=30) or with strings '2' and '30' to run at 2:30 AM daily.
      2. Step 2: Define frequent task schedule correctly

        Use crontab(minute='*/10') to run every 10 minutes; minute=10 runs only at minute 10 each hour.
      3. Step 3: Check all options

        { 'daily-task': { 'task': 'app.tasks.daily', 'schedule': crontab(hour=2, minute=30) }, 'frequent-task': { 'task': 'app.tasks.frequent', 'schedule': crontab(minute='*/10') } } uses correct crontab syntax for both tasks; others have invalid formats or misunderstandings.
      4. Final Answer:

        Use crontab(hour=2, minute=30) and crontab(minute='*/10') -> Option C
      5. Quick Check:

        Daily at 2:30 and every 10 min = { 'daily-task': { 'task': 'app.tasks.daily', 'schedule': crontab(hour=2, minute=30) }, 'frequent-task': { 'task': 'app.tasks.frequent', 'schedule': crontab(minute='*/10') } } [OK]
      Hint: Use '*/10' for every 10 minutes, not minute=10 [OK]
      Common Mistakes:
      • Using '2:30' as hour value
      • Setting minute=10 instead of '*/10' for intervals
      • Mixing string and integer types incorrectly