¡Esta es una revisión vieja del documento!
Un greenlet es un micro-thread sin “organización implícita”, esto significa que contraolas exactamente cuando se está ejecutando y adecuar su uso.
El uso de greenlets es parecido al de una pila de capas. La más baja es la función inicial que fue llamada, y las demás son greenlets actualmente pausados. Se irá indicando cuando se quiere trabajar con uno o con otro (switching).
Cuando se crea un greenlet se inicia una pila vacía y se ejecuta en ella una función específica.
Los greenlet pueden morir al acabar su ejecución o debido a una excepción no controlada.
La salida del siguiente código es: 12, 56, 34. Nunca aparecerá el 78 a no ser que se le añada un gr2.switch() después de imprimir 34.
from greenlet import greenlet def test1(): print 12 gr2.switch() print 34 def test2(): print 56 gr1.switch() print 78 gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch()
Cada greenlet tiene un greenlet “padre” el cual es donde fue creado. El padre también es donde la ejecución del greenlet continua cuando el greenlet muere. En el código de arriba tanto gr1 como gr2 tienen main como el greenlet padre, cuando la ejecución de alguno de los dos acaba se vuelve al main.
Switches entre greenlets ocurren cuando el método switch del greenlet es llamado. Se pasará al greenlet al cual switch() ha sido llamado.
Se puede pasar información
def test1(x, y):< z = gr2.switch(x+y) print z def test2(u): print u gr1.switch(42) gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch("hello", " world")
Imprimirá “hello world” y 42.
switch(*args, **kwargs), cambia la ejecución del greenlet.run, es un atributo que deja de existir cuando el greenlet ha sido iniciado.parent, el greenlet padre.gr_frame, la capa de más arriba (o None).dead, True si el greenlet está muerto.
Podemos hacer un cast a bool de una variable greenlet, esta será true si el greenlet está activo.