À propos du projet
toro est une file de tâches asynchrone pour Python adossée à Redis. Il s'installe depuis PyPI sous le nom `toro-queue` (le nom d'import est `toro`) et est conçu pour les applications asyncio telles que les services FastAPI ou aiohttp.
Points de conception essentiels décrits dans le README :
- API native asynchrone : mettre en file et traiter les tâches avec async/await, sans pools de threads ni pont synchrone.
- Transitions d'état atomiques : les réservations, reprises, promotions et finalisations sont implémentées sous forme de scripts Lua, de sorte qu'une tâche ne peut être perdue ni validée deux fois entre les allers-retours.
- Livraison au moins une fois : des verrous par tâche plus un mécanisme d'arrière-plan de marquage et balayage récupèrent les tâches des workers plantés.
- Typé : fournit py.typed et une API publique entièrement annotée.
Ensemble de fonctionnalités :
- Mise en file de tâches différées et priorités globales (FIFO au sein d'une bande de priorité).
- Reprises avec backoff fixe ou exponentiel et nombre de tentatives plafonné.
- Planifications répétables via des expressions cron ou des intervalles fixes (`every`).
- Flux : arbres de tâches parent/enfant avec fan-out/fan-in, politiques d'échec par enfant et reprise tenant compte du flux.
- Limitation de débit par jeton à l'échelle de la file, partagée entre tous les workers.
- Plafond de concurrence global sur les tâches actives simultanément entre les processus workers.
- Déduplication via des identifiants de tâche idempotents personnalisés et une fenêtre de limitation.
- `concurrency_key` pour sérialiser dans l'ordre les tâches partageant une clé, sans immobiliser un worker.
- Annulation via `cancel_job()`, y compris l'annulation d'un processeur en cours d'exécution à son point d'attente.
- Historique borné avec rétention configurable (valeurs par défaut : les 1000 dernières terminées, 5000 échouées).
- Fonctionnalités de fiabilité : verrous par tâche, renouvellement de verrou, récupération des tâches bloquées.
- Observabilité : progression, journaux par tâche, événements de cycle de vie et `await result()` côté producteur.
- Métriques : `metrics_text()` expose OpenMetrics, adossé à des compteurs qui survivent à un redémarrage.
- Contrôles de cycle de vie : pause/reprise et arrêt gracieux qui vide les tâches en cours.
- Un tableau de bord web live compagnon, matador, est disponible en tant que projet séparé.
Le README inclut un exemple de démarrage rapide créant une `Queue`, ajoutant une tâche, définissant un processeur asynchrone et exécutant un `Worker` avec un réglage de concurrence et un rappel d'événement de fin. D'autres exemples montrent les priorités, le délai, la reprise avec backoff exponentiel, les identifiants de tâche personnalisés idempotents, les planifications cron, les flux avec `FlowChild`, les limites de débit à l'échelle de la file et l'attente du résultat d'une tâche.
Le développement utilise uv et la chaîne d'outils Astral : `uv sync`, ruff pour le linting et le formatage, `ty` pour la vérification de types, et pytest avec des marqueurs pour les tests unitaires, d'intégration (nécessite Redis sur le port 6379) et de charge. Le projet est sous licence MIT.
Comments
0 people shared their preference · Deer Point appears after 10 participants
Sign in to join the discussion.