2009-02-16 18 views
97

Qu'est-ce qu'une coroutine? Comment sont-ils liés à la concurrence?Qu'est-ce qu'une coroutine?

+0

code concurrent ne doit pas nécessairement fonctionner en "parallèle" (n'introduisons pas de nouveaux termes). – user1712447

+0

J'ai écrit une bibliothèque de coroutine avec C standard, supportant les messages select/poll/eplll/kqueue/iocp/Win pour Linux, BSD et Windows. C'est un projet open-source sur https://github.com/acl-dev/libfiber. Les conseils seront bienvenus. –

Répondre

80

Les routines et la concurrence sont largement orthogonales. Coroutines sont une structure de contrôle générale par laquelle le contrôle de flux est transmis de manière coopérative entre deux routines différentes sans retour.

L'instruction 'yield' en Python est un bon exemple. Il crée une coroutine. Lorsque le 'rendement' est rencontré, l'état actuel de la fonction est sauvegardé et le contrôle est renvoyé à la fonction appelante. La fonction appelante peut alors renvoyer l'exécution à la fonction productrice et son état sera restauré au point où le 'yield' a été rencontré et l'exécution se poursuivra.

+9

Quelle est la différence entre appeler une fonction directement et céder à partir d'une coroutine avec l'enrobage de cette fonction dans cette coroutine? –

+1

Il serait peut-être préférable d'expliquer que ces deux concepts ne sont pas vraiment «orthogonaux» dans ce contexte. Vous pouvez certainement dessiner comment les deux concepts sont similaires les uns aux autres. L'idée de passer le contrôle entre deux ou plusieurs choses est très similaire. – steviejay

29

De Programming in Lua, section "Coroutines":

A coroutine est similaire à un filetage (dans le sens de multithreading): elle est une ligne de l'exécution, avec sa propre pile, ses propres variables locales, et son propre pointeur d'instruction; mais il partage des variables globales et surtout n'importe quoi d'autre avec d'autres coroutines. La principale différence entre les threads et les coroutines est que, conceptuellement (ou littéralement, dans une machine multiprocesseur), un programme avec des threads exécute plusieurs threads en parallèle. Les Coroutines, en revanche, sont collaboratives: à un moment donné, un programme avec coroutines exécute seulement une de ses coroutines, et cette coroutine en cours ne suspend son exécution que lorsqu'elle demande explicitement à être suspendue.

Donc le point est: Les routines sont "collaboratives". Même dans un système multi-core, il n'y a qu'une seule coroutine en cours d'exécution à la fois (mais plusieurs threads peuvent fonctionner en parallèle). Il y a non-préemptif entre les coroutines, le coroutine en cours doit renoncer explicitement à l'exécution.

Pour "concurrency", vous pouvez vous référer Rob Pike slide:

est la composition Concurrency des calculs d'exécution de façon indépendante.

Ainsi, pendant coroutine A l'exécution, il passe le contrôle Coroutine B. Puis, après un certain temps, le coroutine B passe le contrôle à coroutine A. Comme il est dépendance entre coroutines, et ils doivent fonctionner en tandem, donc les deux coroutines sont pas la concurrence. La coroutine est similaire à la sous-routine/threads.

+0

J'aimais cette réponse jusqu'à la dernière phrase. Qu'est-ce que ça veut dire? Avez-vous mal orthographié "concurrence"? Si oui, cette conclusion ne semble pas correspondre à la définition fournie. Ou est-ce censé être un nouveau mot "conjonction"? Que veut dire ce mot? –

+0

@ ErickG.Hagstrom: Désolé, j'ai mal orthographié 'concurrency'. Pourquoi pensez-vous que la conclusion ne semble pas correspondre à la définition fournie? –

+0

Les routines ne s'exécutent pas indépendamment. Ils se relaient, chacun attendant que l'autre fasse une partie du travail. Ils se coordonnent activement les uns avec les autres. C'est le contraire de la définition de la concurrence de Rob Pikes. –

6

La différence est qu'une fois qu'un appelant a invoqué un sous-programme/threads, il ne reviendra jamais à la fonction appelant. Mais un coroutine peut revenir à l'appelant après l'exécution de quelques morceaux de code permettant à l'appelant d'exécuter son propre code et de revenir au point coroutine où il a arrêté l'exécution et continuer à partir de là. ie. Une coroutine a plus d'un des points d'entrée et de sortie

1

Sur une note différente, en python bibliothèque gevent est une bibliothèque de réseau basée sur coroutine qui vous donne des fonctionnalités filiformes comme les requêtes réseau async, sans les frais généraux de création et de destruction de threads. La bibliothèque coroutine utilisée est greenlet.

0
  • Coroutines sont grandes fonctionnalités disponibles dans Kotlin Langue
  • Coroutines sont une nouvelle façon d'écrire asynchrone, non bloquant code (et beaucoup plus)
  • Coroutine sont des fils légers. Un fil léger signifie que ne mappe pas sur le thread natif, donc il ne nécessite pas de changement de contexte sur le processeur, donc ils sont plus rapides.
  • Coroutines et les threads sont tous deux multitâche. Mais la différence est que les threads sont gérés par le système d'exploitation et les coroutines par les utilisateurs.

Fondamentalement, il existe deux types de Coroutines:

  1. Stackless
  2. Stackful

Kotlin implémente coroutines de Stackless - il est signifie que les coroutines n'ont pas propre pile, donc ils ne correspondent pas sur le fil natif.

Ce sont les fonctions pour démarrer le coroutine:

launch{} 

async{} 

Vous pouvez en savoir plus d'ici:

https://www.kotlindevelopment.com/deep-dive-coroutines/

https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9