2010-11-24 10 views
29

Mi entendimiento incompleto es que Twisted, Stackless, Greenlet, Eventlet, Coroutines hacen uso de async network IO y de los hilos de userland que son muy livianos y rápidos de cambiar. Pero no estoy seguro de cuáles son las diferencias entre ellos.Python/Erlang: ¿Cuál es la diferencia entre Twisted, Stackless, Greenlet, Eventlet, Coroutines? ¿Son similares a los procesos de Erlang?

También suenan muy similares a los procesos de Erlang. ¿Son más o menos lo mismo?

Cualquiera que pueda ayudarme a entender este tema más sería muy apreciado.

Respuesta

35

En primer lugar, las E/S sin bloqueo no tienen nada en común con los hilos verdes o coroutines, pero pueden afectar la forma en que están programados.

Ahora:

  • Twisted es un marco de E/S no bloqueante clásico - código de la aplicación está escrita en estilo asíncrono mediante devoluciones de llamada.
  • Gevent y eventlet usan la biblioteca greenlet para coroutines/greenthreads/greenlets. Hay un greenlet dedicado para ejecutar eventloop (en el caso de gevent es C-codificado libevent 's evento loop). Cuando greenlet arbitrario comienza a esperar a que se procese alguna operación de E/S, simplemente ejecuta el bucle de evento, que inicia otro greenlet para su ejecución (que está listo para hacer E/S). Esto se llama multitarea cooperativa: cada greenlet decide cuándo devolver el control a otros greenlets.
  • Stackless tiene tasklets, que son similares a greenlets, pero también pueden programarse con un modelo preventivo, lo que significa que el planificador puede detener la ejecución del tasklet en cualquier momento y comenzar la ejecución de otra tasklet (que es cómo los hilos del sistema operativo y los procesos de Erlang trabajo). Además, Stackless no proporciona ninguna instalación de E/S sin bloqueo, por lo que si realiza E/S a través de stdlib, bloqueará toda la secuencia del sistema operativo, de modo que no se podrá ejecutar ninguna otra tarea mientras espera en I/O. Hubo intentos de proporcionar un puerto de la biblioteca gevent para Stackless, pero no sé cómo va.
+3

Twisted también permite escribir código asíncrono sin usar callbacks y máquinas de estado a través del decorador 'twisted.internet.defer.inlineCallbacks' que permitirá al programador usar corutinas basadas en generador (' yield') para lograr un código significativamente más legible que con devoluciones de llamadas . –

+0

* Hay un greenlet dedicado para ejecutar eventloop (...) * ¿No podría haber más de un greenlet con su propio evento eventloop que esencialmente habilitaría estos eventloops para * cooperar *? –

10

cebo tomado! (Corrige la bienvenida!):

Macroscópicamente:

  • twisted: un solo subproceso. logra un comportamiento no bloqueante a través del uso de modismos 'de devolución de llamada' y 'diferidos'. Similar a node.js.
  • greenlet/eventlet: use 'hilos verdes' (¿secciones de memoria?) Para lograr io no bloqueante. En realidad, parchea el CPython IO estándar con sus versiones, por lo que el código se escribe como si fuera bloqueante/secuencial.
  • sin pilas: http://www.stackless.com/. ¿No lo has usado, parece que agrega 'microthreads' y otras sutilezas? stackless example idioms
  • corrutinas: coroutines on SO

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

+0

Twisted no es de un solo hilo per se, tiene soporte de primera clase para roscar y roscas. Además, (al menos) su API de base de datos usa subprocesos por defecto. (adicionalmente, vea mi comentario a la respuesta de andreypopp) –

+0

Además, como dijo andreypopp, los greenlets no tienen nada que ver con IO sin bloqueo: los dos son ortogonales. –

8

Estás casi en la misma edad al comparar Stackless a Greenlet. Lo que falta es:

Stackless per se no add algo.En cambio, Greenlet, inventado 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 un intérprete de reemplazo.

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

Greenlet sigue ganando, probablemente solo debido a la facilidad de uso como módulo de extensión. Así que estoy pensando en revertir el proceso extendiendo Greenlet con decapado. Tal vez eso cambiaría la imagen, de nuevo :-)

Cuestiones relacionadas