Skip to content

Version 1

This documentation refers to the version 1.x of the web framework. The current version of the main branch is documented here.

Background tasks

This page describes how to start background tasks in request handlers, and how to configure background tasks that run periodically during the application's lifetime.

How to handle a request in background

The following example shows how to handle a web request in background, which is the use case for the HTTP 202 Accepted response status code.

import asyncio
from blacksheep import Application, Response, accepted

app = Application(show_error_details=True)
get = app.router.get


async def background_work():
    # simulate a delay...
    await asyncio.sleep(1)
    print("Done!")


@get("/")
def home() -> Response:
    # start a task in background
    asyncio.create_task(background_work())

    # note: the server returns a response immediately, so before the conclusion
    # of the background task
    return accepted("Operation accepted")

How to configure background tasks

The following example shows how to configure a background tasks, including the activation of a service resolved by the DI container, running periodically once every second:

import asyncio
from datetime import datetime

from blacksheep import Application

app = Application()


@app.route("/")
def home():
    return f"Hello, World! {datetime.utcnow().isoformat()}"


def get_current_timestamp():
    return datetime.utcnow().isoformat()


class Foo:
    def __init__(self) -> None:
        pass


async def task_example(app: Application) -> None:
    # example background task, running once every second,
    # this example also shows how to activate a service using the CI container
    while True:
        print(get_current_timestamp())

        my_foo = app.service_provider.get(Foo)
        assert isinstance(my_foo, Foo)
        print("Foo id: ", id(my_foo))

        await asyncio.sleep(1)


async def configure_background_tasks(app):
    asyncio.get_event_loop().create_task(task_example(app))


app.on_start += configure_background_tasks

app.services.add_exact_scoped(Foo)

Last modified on: 2022-02-16 07:52:42

RV