Coroutines en français

Introduction aux coroutines

Les coroutines permettent de gérer l'exécution simultanée de plusieurs tâches sous la forme de processus concurrents. Contrairement à une exécution parallèle, les coroutines ne distribuent pas le travail sur plusieurs cœurs, mais elles permettent de créer des fonctions qui peuvent être mises en pause puis reprises à un autre moment.

Syntaxe des coroutines

Il existe deux méthodes pour créer des coroutines en Lua. La première consiste à définir une fonction et à la passer à la fonction coroutine.create(). La seconde option consiste à déclarer une fonction anonyme directement dans l'appel à coroutine.create().

Voici un exemple de chacune de ces approches :

-- Option 1
local newFunc = function()
  -- Le corps de la fonction
end

local routineA = coroutine.create(newFunc)

-- Option 2
local routineB = coroutine.create(
  function()  -- Déclaration de la fonction anonyme
    -- Le corps de la fonction
    if -- Condition x then
      coroutine.yield()  -- La coroutine est mise en pause jusqu'à son rappel
    end
  end
)

Les états des coroutines

Une coroutine peut être dans l'un des trois états suivants : suspendue, en cours d'exécution ou morte. Ceci est essentiel car cela permet de les utiliser comme des fonctions qui peuvent être temporisées et relancées. L'état d'une coroutine peut être vérifié via la fonction status() et elle peut être reprise avec la fonction resume(). Notez qu'une fois qu'une coroutine atteint l'état "mort", elle ne peut plus être relancée.

Fonctions associées aux coroutines

Les coroutines se gèrent grâce à quelques fonctions utiles : - close() : Termine une coroutine de manière ordonnée, libérant ainsi les ressources associées. - create() : Crée une nouvelle coroutine à partir d'une fonction donnée. - resume() : Relance une coroutine. - running() : Renvoie la coroutine actuellement en cours d'exécution ou nil si appelée dans le thread principal. - status() : Indique l'état de la coroutine fournie sous forme de chaîne de caractères. - wrap() : Retourne une fonction capable de relancer une coroutine, agissant comme un thread tout en retournant une fonction. - yield() : Met la coroutine en pause et retourne au programme appelant.