coroutine

Afficher les obsolètes

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Une coroutine est utilisée pour exécuter plusieurs tâches à la fois à partir du même script. De telles tâches peuvent inclure la production de valeurs à partir des entrées ou l'exécution d'un travail sur une subroutine lors de la résolution d'un problème plus important. Une tâche n'a même pas besoin d'avoir un point d'arrêt défini, mais il doit définir des temps spécifiques à laquelle il lève (pause) pour permettre à d'

Utilisation des Coroutines

Une nouvelle coroutine peut être créée en fournissant une fonction à coroutine.create() . Une fois créée, une coroutine ne démarre pas courir jusqu'à ce que la première appel à Library.


local function task(...)
-- Cette fonction peut faire un peu de travail, puis produire une certaine valeur
coroutine.yield("first") -- Renvoyé par coroutine.resume()
-- La fonction se poursuit une fois qu'elle a repris
return "second"
end
local taskCoro = coroutine.create(task)
-- Appeler resume pour la première fois, qui exécute la fonction depuis le début
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> vrai, d'abord (tâche appelée coroutine.yield()
-- Continuez à exécuter la fonction jusqu'à ce qu'elle génère ou arrête
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")

Pendant la durée de la vie de la coroutine, vous pouvez appeler coroutine.status() pour inspecter son statut :


<tbody>
<tr>
<td><b>suspendu</b></td> <td>La coroutine est en attente d'être reprise. Les corutines commencent dans cet état et entrent quand leur fonction s'appelle <code>coroutine.yield()</code>.</td>
</tr>
<tr>
<td><b>courir</b></td>
<td>La coroutine s'exécute en ce moment.</td>
</tr>
<tr>
<td><b>normal</b></td> <td>La coroutine attend l'exécution d'une autre coroutine ; en d'autres termes, elle a repris une autre coroutine.</td>
</tr>
<tr>
<td><b>mort</b></td> <td>La fonction s'est arrêtée (erreur renvoyée ou exception lancée). La coroutine ne peut pas être utilisée de plus.</td>
</tr>
</tbody>
StatutSignification

Wrap Coroutines

Lorsque vous travaillez avec des coroutines, vous pouvez également renoncer à l'utilisation de l'objet coroutine et utiliser une fonctionnalitéWrap. Une telle fonctionnalitéWrap reprendra une certaine coroutine lorsqu'elle est appelée et ne retournera que les valeurs produites. Vous pouvez le faire en utilisant coroutine.wrap() :


-- Créez une routine et rennez une fonction de rappel qui la reprend
local f = coroutine.wrap(task)
-- Résumez la coroutine comme si nous appelions coroutine.resume()
local result = f()
-- Si une erreur se produit, il sera souligné ici !
-- This differs from coroutine.resume() which acts similar to pcall()

La première valeur renvoyée par coroutine.resume() décrit si une coroutine s'est exécutée sans erreurs. Cependant, les fonctions renvoyées par coroutine.wrap() ne le feront pas : au lieu de cela, elles renvoient directement les valeurs renvoyées ou transmises à coroutine.yield(), si nécessaire. Si une erreur s'

Exemple de modèle de producteur

Imaginez une tâche qui produit des répétitions d'un mot : chaque fois qu'elle produit une répétition, la suivante produira une autre. Par exemple, fournir Hello produira Hello, HelloHello, 1> HelloHello1>, etc. Pour ce faire, vous pouvez définir 4> peatThis4> :


-- Cette fonction répète un mot à chaque fois que sa routine est reprise
local function repeatThis(word)
local repetition = ""
while true do
-- Faites une répétition puis générez le resultats
repetition = repetition .. word
coroutine.yield(repetition)
end
end

Pour exécuter cette fonction comme une coroutine, vous pouvez utiliser coroutine.create() suivi de plusieurs appels à coroutine.resume() :


local repetitionCoro = coroutine.create(repeatThis)
print(coroutine.resume(repetitionCoro, "Hello")) -- oui, Bonjour
print(coroutine.resume(repetitionCoro)) -- oui, Bonjour
print(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello

Pour cette fonction de producteur, vous pouvez également utiliser coroutine.wrap() pour obtenir une fonction qui produit des valeurs :


local f = coroutine.wrap(repeatThis)
print(f("Hello")) -- Bonjour
print(f()) -- Bonjour
print(f()) -- HelloHelloHello

Résumé

Fonctions

Fonctions

close

Ferme et met la coroutine fournie dans un état mort. Cette fonction renvoie true sauf que la coroutine n'est pas dans un état d'erreur, dans lequel cas elle renvoie false et le message d'erreur. Une coroutine qui s'exécute actuellement ne peut pas être fermée. Une coroutine ne peut pas être reprise après qu'elle soit fermée.

Paramètres

Retours

true à moins que la coroutine ne soit fermée dans un état d'erreur.

Variant<string, void>

Le message d'erreur, le cas échéant.

create

Crée une nouvelle coroutine, avec body f. f doit être une fonction Lua.

Paramètres

Retours

isyieldable

Renvoie true si la coroutine est appelée dans la zone de sécurité. Le fait de renvoyer une coroutine dans les métaméthodes ou les fonctions C est interdit, à l'exception de pcall et xpcall.

Retours

Que la coroutine puisse ou non générer en toute sécurité à ce moment.

resume

Démarre ou continue l'exécution de la coroutine co. Le premier fois que vous reprenez une coroutine, il commence à exécuter son corps. Les valeurs ... sont passées comme les arguments à la fonction coroutine. Si la coroutine a produit, reprenez l'ex

Paramètres

...: Variant

Retours

Variant<Tuple, string>

running

Retourne la coroutine d'exécution.

Retours

status

Renvoie le statut de coroutine co, en tant que chaîne : « courir », si la coroutine est en cours d'exécution (c'est-à-dire qu'elle appelle le statut) ; « suspendu », si la coroutine est suspendue dans un appel pour produire, ou si elle n'a pas encore commencé à fonctionner (c'est-à- dire qu'elle a repris une autre coroutine) ; « normal », si la coroutine est active mais n'a pas encore commencé à fonctionner (c'

Paramètres

Retours

Crée une nouvelle coroutine, avec body f. f doit être une fonction Lua. Retourne une fonction qui reprend la coroutine à chaque fois qu'elle est appelée. Tous les arguments passés à la fonction se comportent comme les arguments supplémentaires pour reprendre. Retourne les mêmes valeurs renvoyées par résumer, sauf le premier octet. Dans le cas d'une erreur, propulse l'erreur.

Paramètres

Retours

yield

Tuple<Variant>

Suspend l'exécution de la coroutine d'exécution. Tous les arguments à produire sont passés en tant que résultats supplémentaires pour reprendre. Le fait de produire une coroutine à l'intérieur des métaméthodes ou des fonctions C est interdit, avec l'exception de pcall et xpcall.

Paramètres

...: Tuple

Retours

Tuple<Variant>