Python / Erlang: ¿Cuál es la diferencia entre trenzado, sin apilado, Greenlet, Eventlet, corrutinas? ¿Son similares a los procesos de Erlang?

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

Pregunta

Mi comprensión incompleta es que Twisted, sin apilado, Greenlet, Eventlet, corrutinas todo hacer uso de la red asíncrona IO y los hilos de entorno de usuario que son muy ligero y rápido de interruptor. Pero no estoy seguro de lo que son las diferencias entre ellos.

También suena muy similar a los procesos de Erlang. ¿Son más o menos la misma cosa?

Cualquier persona que podría ayudar a entender este tema más sería muy apreciada.

¿Fue útil?

Solución

En primer lugar, no bloqueo de E / S no tiene nada en común con los hilos verdes o co-rutinas, pero puede afectar a la forma en que están programadas.

Ahora:

  • Twisted es un clásico sin bloqueo de E / S marco - código de la aplicación está escrita en estilo asíncrono mediante devoluciones de llamada .
  • GEvent y eventlet utilizar el href="http://pypi.python.org/pypi/greenlet" rel="noreferrer"> greenlet biblioteca para corrutinas / greenthreads / Verdecillo. Hay una greenlet dedicado para ejecutar el eventloop (en caso de GEvent es C-Coded libevent 's bucle de eventos). Cuando greenlet arbitraria comienza a esperar a alguna operación de E / S de proceso, sólo se da cumplimiento a la bucle de eventos, que se inicia otra greenlet para su ejecución (que está dispuesto a hacer un poco de E / S). Esto se conoce como multitarea cooperativa -. Greenlet cada uno decide sí mismo cuando para devolver el control a otros Verdecillo
  • Stackless tiene tasklets, que son similares a verdillos, pero también se pueden programar con un modelo preventivo - que significa el programador puede detener la ejecución tasklet en cualquier momento y comenzar la ejecución de otro tasklet (que es como hebras de SO y Erlang procesos de trabajo). Además, Stackless no proporciona ningún recurso sin bloqueo de E / S de la caja, así que si lo haces de E / S a través de stdlib - que bloqueará el hilo completo sistema operativo, por lo que ningún otro tasklet puede ejecutar mientras espera en la I / O. Ha habido intentos de proporcionar un puerto de la biblioteca GEvent para Stackless pero no sé cómo va.

Otros consejos

Cebo tomada! (Corrige la bienvenida!):

Macroscópicamente:

  • torcido: single roscado. logra un comportamiento no-bloqueo mediante el uso de devoluciones de llamada '' 'y modismos diferida. Al igual que en node.js.
  • greenlet / eventlet: Uso 'hilos verdes' (? Secciones de memoria) para lograr sin bloqueo io. En realidad el estándar parches CPython IO con sus versiones, por lo que el código todavía está escrito como si se está bloqueando / secuencial.
  • sin pérdida de velocidad: http://www.stackless.com/ . no lo han utilizado, parece que se añade '' microhilos y otras lindezas? sin apilado ejemplo modismos
  • corrutinas: corrutinas en SO

Ninguno de estos son como la luz o bien apoyado como procesos Erlang.

Usted es casi justo al comparar Stackless a Greenlet. Lo que falta es:

Stackless per se no Añadir algo. En su lugar, Greenlet, inventó 5 años después de Stackless, elimina ciertas cosas. Está escrito lo suficientemente simple para ser construido como un módulo de extensión en lugar de reemplazar al intérprete.

Esto es muy divertido-Stackless tiene muchas más características, es unas 10 veces más eficiente en la conmutación, y proporciona el decapado del estado de ejecución.

Greenlet todavía gana, probablemente sólo debido a la facilidad de uso como un módulo de extensión. Así que estoy pensando en revertir el proceso por el que se extiende Greenlet con decapado. Tal vez que iba a cambiar la imagen, una vez más: -)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top