1- Une coroutine en Lua représente une unité d'exécution indépendante à la différence des unités d'exécution des systèmes multi-code.
Néanmoins, une coroutine suspend seulement son exécution en appelant explicitement une fonction de production.
2- Vous créez une coroutine avec un appel à coroutine.create().
Son seul argument est une fonction qui est la principale fonction de la coroutine.
Cette fonction crée seulement une nouvelle coroutine et lui retourne un objet de type "thread".
Elle ne démarre pas l'exécution de la coroutine.
3- Quand vous appelez en premier coroutine.resume(), passant en tant que son premier argument, une unité d'exécution renvoyée par coroutine.create(), la coroutine démarre son exécution à la première ligne de sa principale fonction.
Des arguments supplémentaires passés à coroutine.resume() sont transmis à la fonction principale de la coroutine.
Après que la coroutine ait démarré son exécution, elle fonctionne jusqu'à ce qu'elle se termine ou meurt.
4- Une coroutine peut terminer son exécution de deux façons:
- normalement, quand sa principale fonction renvoie (explicitement ou implicitement, après la dernière instruction)
- anormalement, s'il y a une erreur non protégée.
Dans le premier cas, coroutine.resume() renvoie true, plus n'importe quelle valeur renvoyée par la principale fonction de la coroutine.
En cas d'erreurs, coroutine.resume() renvoie false plus un message d'erreur.
5- Une coroutine est produite en appelant coroutine.yield().
Quand une coroutine est produite, la correspondance coroutine.resume() renvoie immédiatement le résultat, même si la production arrive à l'intérieur d'appels imbriqués de fonction (c'est à dire, pas dans la fonction principale, mais dans une fonction appelée directement ou indirectement par la fonction principale). En cas de production, coroutine.resume() renvoie également true, plus toutes les valeurs passées à coroutine.yield(). La fois suivante où vous reprenez la même coroutine, elle continue son exécution depuis le point où elle est sortie, avec l'appel à coroutine.yield() renvoyant tout argument supplémentaire passé à coroutine.resume().
6- Tout comme coroutine.create(), la fonction coroutine.wrap() crée également une coroutine, mais au lieu de renvoyer la coroutine elle-même, elle renvoie une fonction qui, une fois appelée, reprend la coroutine. Tous arguments passés à cette fonction sont considérés comme arguments supplémentaires de coroutine.resume(). La fonction coroutine.wrap() renvoie toutes les valeurs retournées par coroutine.resume(), excepté la première (le code d'erreur booléen). A la différence de coroutine.resume(), coroutine.wrap() ne décèle pas les erreurs; n'importe quelle erreur est propagée à la fonction appelante.