Dramatiq

Dramatiq é uma biblioteca Python que fornece uma estrutura simples e confiável para a criação de filas de tarefas assíncronas e distribuídas e sistemas de processamento de tarefas em segundo plano. Ela funciona enviando mensagens para um broker de mensagens como RabbitMQ ou Redis, que então distribui essas tarefas para processos de trabalho que executam as tarefas em segundo plano. Os principais recursos incluem uma API direta, suporte para trabalhadores baseados em threads para maior eficiência, reconhecimento automático de mensagens para maior confiabilidade e a capacidade de definir tarefas como “atores” para execução assíncrona, semelhante a linguagens como Elixir e Akka.

Exemplo de uso copiado da documentação:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import dramatiq
import requests


@dramatiq.actor
def count_words(url):
    response = requests.get(url)
    count = len(response.text.split(" "))
    print(f"There are {count} words at {url!r}.")


# Synchronously count the words on example.com in the current process
count_words("http://example.com")

# or send the actor a message so that it may perform the count
# later, in a separate process.
count_words.send("http://example.com")

Comparação com outras bibliotecas

Atualizado em

Casos de teste

Apesar da biblioteca fornecer uma API/implementação simples, tive algumas dificuldades para realizar os testes unitários.

Ferramentas utilizadas:

  • docker (28.4.0)
  • docker-compose (2.39.4)
  • Make (3.81)
  • uv (0.8.19)
  • python (3.10)

O repositório com os casos de teste está organizado da seguinte forma:

dramatiq-example/
├── app/                        <-- aplicações
│   ├── tc_01/
│   │   ├── __init__.py
│   │   ├── .env                <-- aplicações
│   │   ├── config.py           <-- aplicações
│   │   ├── routes.py           <-- aplicações
│   │   └── tasks.py            <-- aplicações
│   └── ...
├── dockerfiles/                <-- dockerfiles
│   ├── Dockerfile.tc_01
│   └── ...
├── tests/                      <-- testes
│   ├── tc_01/
│   │   ├── __init__.py
│   │   ├── conftest.py         <-- testes
│   │   └── test_app.py         <-- testes
│   └── ...
├── docker-compose.yml          <-- orquestração
├── Makefile                    <-- comandos
├── pyproject.toml              <-- dependências
└── uv.lock                     <-- dependências
make run.all
make test.all

[01] - Seguindo a documentação

Uma abordagem mais direta, apenas seguindo as documentações de um exemplo básico do FastAPI + um exemplo básico do dramatiq.

https://12factor.net/pt_br/config

make run.c01
make test.c01

[02] - Imports locais + mocks

https://stackoverflow.com/questions/1699108/local-import-statements-in-python https://stackoverflow.com/questions/4177735/best-practice-for-lazy-loading-python-modules

dependencia ciclica

make run.c02
make test.c02

[03] - testcontainers

https://testcontainers-python.readthedocs.io/en/latest/#docker-in-docker-dind

make run.c03
make test.c03

[04] - docker-compose

make run.c04
make test.c04