Python / Erlang: Quelle est la différence entre Twisted, Stackless, Greenlet, eventlet, Coroutines? Sont-ils semblables à des processus Erlang?

StackOverflow https://stackoverflow.com/questions/4263059

Question

Ma compréhension incomplète est que Twisted, Stackless, Greenlet, eventlet, Coroutines tout faire usage de réseau IO et async fils de userland qui sont très léger et rapide à l'interrupteur. Mais je ne sais pas quelles sont les différences entre eux.

En outre, ils ressemblent beaucoup aux processus Erlang. Sont-ils à peu près la même chose?

Toute personne qui pourrait me aider à comprendre ce sujet plus serait grandement apprécié.

Était-ce utile?

La solution

Tout d'abord, non bloquante E / S n'a rien en commun avec des fils verts ou coroutines, mais elle peut influer sur la façon dont ils sont programmés.

  • Twisted est un cadre classique I / O non-blocage - code d'application est écrit dans un style async utilisant callbacks .
  • Gevent et eventlet utiliser le Greenlet bibliothèque coroutines / greenthreads / greenlets. Il y a un Greenlet dédié à l'exécution du eventloop (en cas de gevent il est C-Coded libevent 's boucle d'événements). Lorsque Greenlet arbitraire commence à attendre une opération d'E / S à traiter, il donne juste l'exécution de la boucle d'événement, qui démarre une autre Greenlet pour l'exécution (qui est prêt à faire des E / S). Ceci est appelé multi-tâches coopératif -. Chaque Greenlet décide lui-même quand il faut revenir à d'autres le contrôle greenlets
  • Stackless a tasklets, qui sont similaires à greenlets, mais peut également être prévue avec un modèle préemptive - que signifie l'ordonnanceur peut arrêter l'exécution tasklet à tout moment et lancer l'exécution d'un autre tasklet (qui est la façon dont les fils de système d'exploitation et traite Erlang travail). En outre, Stackless ne fournit pas d'installations d'E / S non-bloquant de la boîte, donc si vous faites E / S via stdlib - il va bloquer l'ensemble du fil OS, donc pas d'autre tasklet peut exécuter pendant que vous êtes en attente sur I / O. Il y a eu des tentatives pour fournir un port de la bibliothèque gevent pour Stackless mais je ne sais pas comment ça va.

Autres conseils

Bait pris! (Corrections bienvenues!):

Grossièrement:

  • twisted: un seul thread. permet d'obtenir un comportement non-blocage par l'intermédiaire de l'utilisation des expressions « callbacks » et « différée ». Semblable à Node.js.
  • Greenlet / eventlet: «threads verts utilisation (? Sections de mémoire) pour atteindre io non-bloquant. En fait, la norme patches CPython IO avec leurs versions, ce code est encore écrit comme si elle bloque / séquentielle.
  • stackless: http://www.stackless.com/ . Je n'ai pas utilisé, on dirait qu'il ajoute « microfiletages » et d'autres raffinements? stackless exemple idiomes
  • coroutines: coroutines sur le SO

Aucune de ces sous forme de lumière ou bien pris en charge en tant que processus Erlang.

Vous êtes presque à droite lorsque l'on compare Stackless à Greenlet. La chose qui manque est:

Stackless en soi ne pas Ajouter quelque chose. Au lieu de cela, Greenlet, inventé 5 ans après Stackless, supprime certaines choses. Il est écrit assez simple pour être construit comme un module d'extension au lieu d'un interprète de remplacement.

Ce qui est vraiment drôle Stackless a beaucoup plus de fonctionnalités, est d'environ 10 fois plus efficace sur la commutation, et fournit le décapage de l'état d'exécution.

Greenlet gagne encore, probablement en raison de la facilité d'utilisation en tant que module d'extension. Donc, je pense à revenir le processus en étendant Greenlet avec décapage. Peut-être que cela changerait l'image, encore une fois: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top