Skip to main content

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 heapq rodando 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) e sched.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

  1. Zero Bloqueio: Nenhuma função síncrona ou método (time.sleep) deve interceptar o loop principal.
  2. 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.
  3. Foco na Developer Experience (DX): A complexidade matemática e de concorrência deve sempre ficar escondida sob os panos do motor.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

schedq-0.0.1.tar.gz (4.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

schedq-0.0.1-py3-none-any.whl (4.6 kB view details)

Uploaded Python 3

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

Hashes for schedq-0.0.1.tar.gz
Algorithm Hash digest
SHA256 16898bb835af4430932d9b458cd252de6a35ee8d2c60bf414d43340c113a9261
MD5 263f01605d6961ecfa84818b416dfb26
BLAKE2b-256 145370d0e9298d4c2588021cc8bcef64e74f358b6948406a00f9ccfa7d0c922f

See more details on using hashes here.

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

Hashes for schedq-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5852546616621da088ce378edd12ac060d74e01985a97ba52ac2a3090bbde77e
MD5 616e674fa3080c83c237eafe959e1ac1
BLAKE2b-256 7927fea66413ce5cee41538e8e488781a844d0b0316c1491bd351f818e638dd8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page