Vérifier l'état d'une coroutine
Fait partie de la section Logic & Flow du Journey Lua de Coddy — leçon 52 sur 54.
Lorsque vous travaillez avec des coroutines, vous aurez souvent besoin de savoir dans quel état se trouve une coroutine. Est-elle en cours d'exécution ? Est-elle en pause et en attente de reprise ? A-t-elle fini de s'exécuter ?
Lua fournit la fonction coroutine.status() pour répondre à ces questions.
La fonction coroutine.status() prend une coroutine comme argument et renvoie une chaîne décrivant son état actuel. Il existe trois états possibles :
| "suspended" | La coroutine est en pause à un yield() et peut être reprise |
| "running" | La coroutine est actuellement en cours d'exécution |
| "dead" | La coroutine a terminé son exécution et ne peut plus être reprise |
Voici comment l'utiliser :
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended" (en pause au yield)
coroutine.resume(co)
print(coroutine.status(co)) -- "dead" (terminé)Défi
FacileÉcrivez une fonction checkCoroutineLifecycle qui prend resumeCount et renvoie une chaîne de caractères montrant le statut d'une coroutine à différents moments de son cycle de vie.
Créez une coroutine qui cède (yield) une fois, puis se termine. Vérifiez et enregistrez son statut après la création, après la première reprise (lorsqu'elle est en pause au yield), et après les reprises suivantes basées sur resumeCount.
Logique :
- Créez une fonction qui cède la chaîne
"paused"une fois, puis se termine - Enveloppez cette fonction dans une coroutine en utilisant
coroutine.create() - Vérifiez le statut immédiatement après la création en utilisant
coroutine.status() - Reprenez la coroutine une fois et vérifiez à nouveau son statut
- Reprenez la coroutine des fois supplémentaires basées sur
resumeCount - 1(total des reprises = resumeCount) - Vérifiez le statut final après toutes les reprises
- Renvoyez une chaîne avec les trois statuts au format :
initial: [status]\\nafter first resume: [status]\\nfinal: [status]
Paramètres :
resumeCount(nombre) : Nombre total de fois qu'il faut reprendre la coroutine (minimum 1)
Retourne : Une chaîne montrant le statut de la coroutine à trois moments de son cycle de vie (chaîne). Format : initial: suspended\nafter first resume: suspended\nfinal: dead
Aide-mémoire
La fonction coroutine.status() renvoie l'état actuel d'une coroutine sous forme de chaîne de caractères.
États possibles :
"suspended"- La coroutine est en pause à unyield()et peut être reprise"running"- La coroutine est actuellement en cours d'exécution"dead"- La coroutine a terminé son exécution et ne peut pas être reprise
Utilisation :
coroutine.status(coroutine_object)Exemple :
function task()
coroutine.yield()
print("Finishing")
end
local co = coroutine.create(task)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "suspended"
coroutine.resume(co)
print(coroutine.status(co)) -- "dead"Essayez vous-même
function checkCoroutineLifecycle(resumeCount)
-- Écrire le code ici
end
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() vs. ipairs()Récapitulatif - Fiche de personnage2Plus de fonctions de la bibliothèque table
table.concat()Construction de table & unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des scores3Concepts avancés sur les fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu'est-ce qu'une closure ?Récapitulatif - Gestionnaire d'événements simple6Gestion des erreurs
La fonction error()Appels protégés avec pcall()Récapitulatif - Division sécurisée9Les coroutines pour débutants
Qu'est-ce qu'une coroutine ?coroutine create & resumePause avec coroutine.yield()resume & yieldVérifier l'état d'une coroutineRécapitulatif - Générateur de nombresRécapitulatif - Calcul vectoriel