Serviços em background

Existem casos onde você precisa executar código em paralelo a sua aplicação, por exemplo, para escutar uma fila de mensageria.

Zayt provê o decorator zayt.web.background para marcar funções para serem executadas em background como tasks assíncronas junto à aplicação principal.

from zayt.web import background


@background
async def background_service():
    ...

Funções de serviços em background podem receber serviços como parâmetros do sistema de injeção de dependências.

Por exemplo, você pode criar uma função que escuta notificações do Redis:

import structlog
from redis.asyncio import Redis
from zayt.web import background

logger = structlog.get_logger(__name__)


@background
async def listen_channel(redis: Redis):
    async with redis.pubsub() as pubsub:
        await pubsub.psubscribe("chat")
        while True:
            message = await pubsub.get_message(
                ignore_subscribe_messages=True,
                timeout=None
            )
            if message:
                logger.info(
                    "chat message",
                     value=message["data"].decode(),
                 )