Lightweight, high-performance asynchronous task scheduling engine with no external dependencies.
Project description
schedq
O schedq é um motor de agendamento de tarefas assíncronas em Python que foca em ser extremamente leve, performático e independente. Utilizando exclusivamente primitivas nativas da linguagem e estruturas de dados de alta performance, ele elimina a necessidade de infraestruturas pesadas para cenários concorrentes.
Inspirado na usabilidade moderna baseada em decoradores (como Prefect) e na eficiência matemática de baixo nível (uso de Filas de Prioridade), o schedq oferece controle total do tempo sem desperdício de CPU.
Recursos Atuais (O que ele já faz)
- Agendamento por Min-Heap: Organização interna baseada no módulo nativo
heapqrodando em C. O motor avalia apenas o topo da árvore (O(1)) e dorme o tempo exato até a próxima tarefa, resultando em 0% de uso de CPU ociosa. - Concorrência Assíncrona: Construído sobre o
asyncio. Execuções demoradas são disparadas como background tasks, impedindo que uma tarefa lenta atrase o relógio das demais. - Rastreamento por IDs (Observabilidade): Separação nativa entre TID (Task ID, fixo para a definição da tarefa) e EID (Execution ID, único para cada ciclo de execução), ideal para estruturação de logs.
- Interface Fluida (Decoradores): Sintaxe amigável e limpa para registro de rotinas com suporte a nomes customizados opcionais.
Roadmap de Evolução (Próximos Passos)
Para transformar este motor leve em um orquestrador resiliente e pronto para ambientes críticos de produção, planejamos implementar os seguintes módulos de forma incremental:
1. Módulo de Persistência (Resiliência)
Atualmente as tarefas vivem apenas na memória volátil do processo.
- Objetivo: Adicionar adaptadores opcionais para armazenamento de estados (ex: SQLite integrado ou Redis).
- Recurso: Mecanismo de Misfire para decidir o que fazer se o servidor reiniciar e perder a janela exata de execução de uma tarefa.
2. Módulo de Tolerância a Falhas (Retries & Circuit Breaker)
Atualmente Exceptions dentro de uma task somem silenciosamente.
- Objetivo: Capturar erros em nível de execução sem derrubar o loop principal do motor.
- Recurso: Implementação de políticas de Exponential Backoff (tentativas automáticas com espaçamento de tempo crescente) e alertas para falhas definitivas.
3. Módulo de Controle de Concorrência (Limitação de Instâncias)
Atualmente, se uma tarefa a cada 5s demorar 20s para rodar, o motor criará instâncias paralelas descontroladamente.
- Objetivo: Introduzir a propriedade
max_instances. - Recurso: Permitir que o motor pule (skip) ou enfileire o próximo disparo caso a instância anterior da mesma tarefa ainda esteja sendo executada.
4. Módulo de Controle Dinâmico (Gerenciamento em Runtime)
Atualmente o motor roda em uma caixa preta após o .start().
- Objetivo: Criar uma API programática para manipulação das tarefas em tempo real.
- Recurso: Métodos como
sched.pause(tid),sched.resume(tid)esched.trigger_now(tid)para forçar a execução imediata ignorando o relógio.
5. Expressões Cron e Suporte a Fusos Horários (Timezones)
Atualmente o motor suporta apenas intervalos relativos (timedelta).
- Objetivo: Integração com parsers de Cron leves para agendamentos em horários humanos específicos (ex: "Toda segunda-feira às 08:00").
- Recurso: Tratamento nativo de Timezones para evitar desvios causados por fusos horários de servidores (UTC) ou horários de verão.
Como Usar (Exemplo de Implementação)
import asyncio
import datetime
from scheduler import Scheduler
sched = Scheduler()
@sched.task(interval=datetime.timedelta(seconds=4), name="Task name")
async def example(tid: str, eid: str, name: str):
# Logic here
await asyncio.sleep(1)
async def main():
await sched.start()
if __name__ == "__main__":
asyncio.run(main())
Diretrizes de Design
- Zero Bloqueio: Nenhuma função síncrona ou método (
time.sleep) deve interceptar o loop principal. - Dependência Opcional: Recursos mais pesados (como bancos de dados para persistência) devem ser plugáveis e opcionais para manter o core do motor sempre leve.
- Foco na Developer Experience (DX): A complexidade matemática e de concorrência deve sempre ficar escondida sob os panos do motor.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file schedq-0.0.1.tar.gz.
File metadata
- Download URL: schedq-0.0.1.tar.gz
- Upload date:
- Size: 4.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16898bb835af4430932d9b458cd252de6a35ee8d2c60bf414d43340c113a9261
|
|
| MD5 |
263f01605d6961ecfa84818b416dfb26
|
|
| BLAKE2b-256 |
145370d0e9298d4c2588021cc8bcef64e74f358b6948406a00f9ccfa7d0c922f
|
File details
Details for the file schedq-0.0.1-py3-none-any.whl.
File metadata
- Download URL: schedq-0.0.1-py3-none-any.whl
- Upload date:
- Size: 4.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5852546616621da088ce378edd12ac060d74e01985a97ba52ac2a3090bbde77e
|
|
| MD5 |
616e674fa3080c83c237eafe959e1ac1
|
|
| BLAKE2b-256 |
7927fea66413ce5cee41538e8e488781a844d0b0316c1491bd351f818e638dd8
|