54 votes

Quels sont les cas d'utilisation d'une coroutine?

Le concept de coroutine semble très intéressant, mais je ne sais pas, si cela a du sens dans un environnement vraiment productif? Quels sont les cas d'utilisation des coroutines, qui peuvent être résolus de manière plus élégante, plus simple ou plus efficace qu'avec d'autres méthodes?

53voto

Ali Afshar Points 22836

Quelques bonnes réponses décrivant ce que sont les coroutines.

Mais pour un cas d'utilisation réel. Prenez un serveur Web. Il dispose de plusieurs connexions simultanées et souhaite planifier la lecture et l'écriture de chacune d'entre elles.

Cela peut être implémenté à l'aide de coroutines. Chaque connexion est une coroutine qui lit / écrit une petite quantité de données, puis "cède" le contrôle au planificateur, qui passe à la coroutine suivante (qui fait la même chose) pendant que nous parcourons toutes les connexions disponibles.

26voto

Charlie Martin Points 62306

Beaucoup d'entre eux, par exemple:

grep TODO *.c *.h | wc -l

Le pipeline ci-dessus est exactement une coroutine: l' grep commande génère une séquence de lignes qui vont vers une mémoire tampon, l' wc commande "mange vers le haut"; si le tampon se remplit, l' grep "blocs" jusqu'à ce que le tampon se vide, et si le tampon est vide, l' wc commande attend pour la nouvelle entrée.

La chose à propos de coroutines, c'est qu'ils sont le plus souvent maintenant utilisée dans plus de contrainte de modèles, comme le Python générateurs mentionné, ou que les pipelines.

Si vous voulez regarder de plus chez eux, voir les articles de Wikipédia, en particulier sur les coroutines et itérateurs.

20voto

Bevan Points 20976

Vrai coroutines besoin du soutien de votre outillage - ils doivent être mises en œuvre par le compilateur et pris en charge par le framework sous-jacent.

Un exemple réel de Coroutines est trouvé avec le "taux de retour" de mots clés fournis en C# 2.0, qui permet d'écrire une méthode qui renvoie plusieurs valeurs pour la lecture en boucle.

Le "taux de retour" a ses limites, cependant, - la mise en œuvre utilise une classe d'assistance à la capture de l'état, et il prend en charge un cas particulier de la coroutine comme générateur (itérateur).

Dans le cas plus général, l'avantage de Coroutines, c'est qu'ils font de certaines etat selon les calculs beaucoup plus facile d'exprimer et de plus facile à comprendre, la mise en œuvre d'une machine à état comme un ensemble de coroutines peut être plus élégant que le plus commun des approches. Mais, en faisant cela nécessite l'appui et de l'outillage qui n'existe pas encore en C# ou Java.

15voto

ddaa Points 19102

Les coroutines sont utiles pour mettre en œuvre des modèles de producteurs / consommateurs.

Par exemple, Python a introduit des coroutines dans une fonction de langage appelée générateurs , qui était destinée à simplifier la mise en œuvre des itérateurs.

Ils peuvent également être utiles pour implémenter le multitâche coopératif, où chaque tâche est une coroutine qui cède la place à un ordonnanceur / réacteur.

11voto

supercat Points 25534

Coroutines peut être utile en tout temps par un système de deux ou plusieurs morceaux de code dont la plus naturelle, la représentation serait comme une série séquentielle des étapes qui impliquent beaucoup d'attente.

Considérons, par exemple, un appareil qui dispose d'un écran LCD et clavier de l'interface utilisateur et d'un modem, et il a besoin d'utiliser le modem régulièrement appel et le rapport de son statut indépendant de ce que l'utilisateur à le pavé numérique est en train de faire. La plus belle façon d'écrire l'interface utilisateur peut être d'utiliser des fonctions comme "input_numeric_value(&CONV_SPEED_FORMAT, &conveyor_speed);" qui sera de retour lorsqu'un utilisateur a entré une valeur, et de la plus belle façon de gérer la communication peut être utiliser des fonctions comme "wait_for_carrier();" qui sera de retour lorsque l'appareil soit connecté ou déterminée, il ne va pas.

Sans coroutines, soit l'INTERFACE utilisateur du sous-système ou le modem sous-système devrait être mis en œuvre à l'aide d'une machine d'état. À l'aide de coroutines rend possible pour les deux sous-systèmes à être écrite de la manière la plus naturelle de style. Notez qu'il est important que ni le sous-système ne va jamais très longtemps sans mettre les choses dans un "uniforme" de l'état et de l'appel de rendement (de), ni les appels de rendement() sans mettre les choses dans une "cohérence" de l'état premier, mais il est généralement pas difficile de répondre à ces contraintes.

Notez que, bien que l'on pourrait utiliser à plein soufflé multitâche, qui nécessite l'utilisation de verrous partout tout le temps partagé état est modifié. Depuis la coroutine sélecteur de ne jamais basculer les choses, sauf à de rendement() appels de routine peut modifier librement partagé état tant qu'il s'assure que tout dans l'ordre avant la prochaine rendement, et est préparé pour l'autre routine de modifier l'état "pendant" le rendement (de).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X