eCorpus Task System

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 */
    }