Skip to main content
FastAPI has two ways to run work outside the request. BackgroundTasks runs a function in the web process right after it sends the response: fine for a few seconds of work, but the task is lost if the instance restarts, and it shares the web process’s CPU. For anything longer, Celery runs the tasks in a separate background worker process on Sevalla, with a Redis database holding the queue.

Before you begin

Run a short task after the response

Add a BackgroundTasks parameter to a route and queue the function on it. It needs no setup on Sevalla:
storefront/main.py

Create a Redis database

1

Create the database

In the sidebar, click Databases, then click Create database. Under Database, choose Redis, or Valkey: the code in this guide works with both. Enter storefront-redis as the Display name, choose the same Data center as the application and a Size, then click Create database.
2

Connect it to the application

In the sidebar, click Applications, then click the application. Click the Networking tab. Under Connected services, click Add internal connection. Choose storefront-redis as the Service, turn on Add environment variables to the application, and click Add internal connection. Sevalla adds REDIS_HOST, REDIS_PORT, REDIS_PASSWORD and REDIS_URL. See Connect an application.

Add Celery to the project

Install Celery with its Redis support, and update requirements.txt:
Create the Celery application and a task:
storefront/worker.py
Queue the task from a route with delay:
storefront/main.py
Commit and push the changes.

Run the worker on Sevalla

1

Create the background worker

On the application’s Processes tab, click Create process. Choose Background worker, enter Celery worker as the Name and this Custom start command:
Choose a Resource and click Create process.
2

Deploy

Click Deploy in the undeployed changes bar at the bottom of the page.
Set --concurrency to match the size. Without it, Celery starts one worker process per CPU of the machine it runs on, which can be more than the process’s memory holds. Two processes fit in H1 (0.3 GB of memory). To process more tasks at once, add instances in the process’s Scaling section, or choose a larger size and raise --concurrency. See Scaling.
The Create process sheet with Background worker selected, the Name and Custom start command fields, the resource and the scaling settingsThe Create process sheet with Background worker selected, the Name and Custom start command fields, the resource and the scaling settings

Run tasks on a schedule

Run scheduled work as a cron job: create a Cron job process with a Schedule in cron syntax, such as 0 3 * * * for every day at 03:00 UTC, and a Custom start command that runs a script, such as python -m storefront.cleanup. See Cron jobs.

Verify

  1. Queue a task, with your application’s domain:
    The response is {"status":"queued"}.
  2. Click the Logs tab and look at the worker’s runtime logs. They show Task storefront.worker.send_order_confirmation[...] received, the line Sending the confirmation for order 42, and Task storefront.worker.send_order_confirmation[...] succeeded.
On the Processes tab, the Celery worker process shows Running. If it shows Crashed, the logs show why, for example Error 111 connecting when REDIS_URL is missing or wrong.