Elixir et le module Task

Hello les loulous! Oui Elixir est un beau langage. Cet remarque est purement personnelle et ne repose sur aucun argument technique. Mais c’est ainsi. Elixir est mon jouet. Je ne code pas professionnellement avec. Je l’utilise pour apprendre le paradigme fonctionnel. Certains râleurs diront que ce n’est pas le meilleur langage pour apprendre le fonctionnel et qu’il serait mieux de commencer par Lisp. Mais comme c’est écrit sur le bavoir ci-dessous, “je m’en fish”.


Aujourd’hui j’aimerais vous présenter le module Task.

Task spawn un processus pour exécuter une tâche précise passée en paramètre. Le plus souvent le processus est isolé, il ne cherche pas à communiquer avec d’autres processus. Le use case le plus fréquent est de créer une tâche dans le but de convertir des données ou de faire un calcul pouvant être fait en parallèle. Le concept principal d’une Task est la conversion de code séquentiel en code concurrent.

Cela me fait penser à la création de background jobs avec Sidekiq en Ruby. Mais les projets Ruby se rapprochant le plus des Tasks Elixir sont celluloid et concurrent-ruby.

Le module Task est celui se rapprochant le plus d’un processus Elixir. Task.start permet de lancer un processus Elixir comme avec spawn.

Task.start(fn() -> 2 * 2 end)

Mais son utilité est limitée car la valeur du processus n’est pas retournée. Il y a surement des cas ou cela semble intéressant mais ce n’est pas la raison principale de l’utilisation de Task.

Ne nous attardons pas sur cette méthode et intéressons nous plutôt aux méthodes Task.async et Task.await. Ce duo de méthodes nous permet de lancer l’exécution d’une fonction en parallèle et d’en récupérer la valeur. Tout comme start la méthode async nous permet de lancer une processus. La différence est qu’async retourne une Task struct. Cette struct peut être ensuite passée à await pour récupérer le résultat de la fonction.

task = Task.async(fn -> une_tache_qui_prend_du_temps() end)
# format du Task struct:
# %Task{pid: #PID<0.63.0>, ref: #Reference<0.0.3.77>}
# Le reste du code …
# On récupère le résultat
result = Task.await(task)

Voili. C’est tout pour cette petite introduction aux Tasks Elixir. Si vous avez déjà lu des choses sur ce joli langage, vous remarquerez que je ne parle pas du tout de Supervision. La raison en est que je ne maitrise pas encore cette partie. Dès que j’en saurais plus sur ce sujet, je ferais une note dessus.

Leave a comment