Fonctionnalités en cours de développement.
Définitions
Task
Unité de travail. Une tâche est enregistrée dans la base de données avec les informations suivantes:
task_id
Numéro de série de la tâche. Entier de 64bits unique autoincrémenté.
type
Chaine de caractère permettant de relier une tâche dans la base de donnée à la méthode à utiliser pour l’executer.
status
Chaque tâche a un statut, qui peut prendre pour valeur:
type TaskStatus = 'initializing'|'pending'|'aborting'|'running'|'success'|'error';
data
Une quantité arbitraire de données statiques peuvent être attachées sous forme de JSON dans le champ data.
parent
Une tâche peut créer d’autres taches, dites « enfant ». Celles-ci auront alors un champ parent pointant vers la task_id de ce dernier.
Une tâche sans parent est généralement désignée root task. Ce sont les tâches créées directement par des requêtes d’utilisateur ou d’automatisation.
C’est ces dernières qui apparaîtront dans les listes de tâches.
relations
Une tâche peut être attachée à un nombre arbitraire de relations. Celles-ci sont créées avant le démarrage de la tâche cible (au moment de sa création, ou tant que son statut est "initializing").
Les relations sont unidirectionelles : Une tâche « target » ne démarre qu’une fois que toutes les tâches « source » attachées sont au status "success".
Les relations sont matérialisées dans le champ after sous la forme d’un tableau de task_id.
Attention à ne pas confondre les relations parent/enfant, correspondant purement à la présentation des tâches, et les relations de dépendance, materialisées par le champ after.
TaskScheduler
Classe utilisée pour créer des tâches et être averti de leur completion
TaskProcessor
Classe dédiée à l’acquisition de tâche et à l’execution des méthodes associées.
Design
Les tâches doivent être concues pour se terminer aussitôt que possible. Le parallélisme des TaskProcessor est limité et une nouvelle tâche ne peut commencer tant que la précédente n’est pas terminée.
Pour les tâches longues, une tâche parente peut créer tous ses enfants rapidement, puis se terminer en retournant la task_id du dernier enfant, qui définira le résultat final du groupe.
Exemple:
async function someTask({context:{tasks}}){
//Create a child task that will do the actual work
return await tasks.create({
type: "someWorkHandler",
data:{
// [...]
}
});
}
Groupes
La tâche groupOutputsTask permet d’effectuer des opérations simples de réduction des entrées/sorties.
Elle reçoit en entrée une liste des résultats des tâches dont elle dépends.
Par défaut, elle transmets cette liste en sortie. Si le champ data du groupe est défini, il sera utilisé pour projeter ses entrées sur celui-ci.
Exemple:
await tasks.create({
type: "groupOutputsTask",
data: {
id: 1234,
meta: `$[${meta_task_id}]`,
size: `$[${copy_task_id}].size`
},
after: [meta_task_id, copy_task_id],
});
//résultat, materialisé dans task.output:
{
id: 1234,
meta: { /* le résultat de la tâche "meta" */},
size: 0 /* le résultat de la tâche copy */
}