Bird
Raised Fist0
Djangoframework~20 mins

Periodic tasks with Celery Beat in Django - Practice Problems & Coding Challenges

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
Challenge - 5 Problems
🎖️
Celery Beat Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
1:30remaining
What happens when a periodic task is scheduled with Celery Beat?
Consider a Django project using Celery and Celery Beat. If you schedule a periodic task to run every 10 minutes, what will Celery Beat do?
ACelery Beat only logs the task schedule but does not trigger any execution.
BCelery Beat sends a message to the Celery worker every 10 minutes to execute the task.
CCelery Beat stores the task results every 10 minutes but does not trigger execution.
DCelery Beat runs the task itself every 10 minutes without involving Celery workers.
Attempts:
2 left
💡 Hint
Think about how Celery Beat interacts with Celery workers to run tasks.
📝 Syntax
intermediate
1:30remaining
Which Celery Beat schedule syntax correctly runs a task every hour?
Given the following Celery Beat schedule snippet, which option correctly schedules a task to run every hour?
Django
from celery.schedules import crontab

CELERY_BEAT_SCHEDULE = {
    'task-every-hour': {
        'task': 'myapp.tasks.my_task',
        'schedule': ???
    }
}
Acrontab(minute=0, hour='*')
Bcrontab(minute='*', hour=0)
Ccrontab(minute=0, hour=0)
Dcrontab(minute='0', hour='0-59')
Attempts:
2 left
💡 Hint
An hourly task runs at minute 0 of every hour.
🔧 Debug
advanced
2:00remaining
Why does a periodic task not run even though Celery Beat is running?
You have Celery Beat running and a periodic task scheduled. However, the task never executes. Which of the following is the most likely cause?
AThe periodic task schedule is set to a past date.
BCelery Beat is running with the wrong timezone setting.
CThe task function is missing a @shared_task decorator.
DCelery worker is not running or not connected to the message broker.
Attempts:
2 left
💡 Hint
Celery Beat only sends messages; workers must be ready to receive them.
state_output
advanced
1:30remaining
What is the state of a periodic task after Celery Beat triggers it?
When Celery Beat triggers a periodic task, what is the expected state of the task in Celery's task monitoring system immediately after triggering?
AThe task state is 'PENDING' until a worker picks it up.
BThe task state is 'STARTED' immediately after Celery Beat triggers it.
CThe task state is 'RETRY' until the task completes.
DThe task state is 'SUCCESS' immediately after Celery Beat triggers it.
Attempts:
2 left
💡 Hint
Think about when the task actually starts running.
🧠 Conceptual
expert
2:30remaining
How does Celery Beat ensure periodic tasks run on schedule in a distributed system?
In a distributed Django application with multiple Celery Beat instances running for redundancy, how does Celery Beat prevent the same periodic task from running multiple times simultaneously?
ACelery Beat instances communicate over the network to elect a leader manually.
BEach Celery Beat instance runs the task independently, and Celery workers deduplicate tasks.
CCelery Beat uses a distributed lock in the message broker or database to allow only one scheduler to send task messages.
DCelery Beat disables periodic tasks on all but one instance automatically.
Attempts:
2 left
💡 Hint
Think about how distributed systems avoid duplicate work.

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