Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
fw:greenlet [2013/07/04 16:30] alfred |
— (actual) | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ====== Greenlet ====== | ||
| - | 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. | ||
| - | <code python> | ||
| - | 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() | ||
| - | </code> | ||
| - | |||
| - | ===== Conceptos ===== | ||
| - | |||
| - | ==== Muerte de un greenlet ==== | ||
| - | 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. | ||
| - | |||
| - | ==== Creación ==== | ||
| - | |||
| - | ==== Switching ==== | ||
| - | 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 | ||
| - | |||
| - | <code python> | ||
| - | 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") | ||
| - | </code> | ||
| - | Imprimirá "hello world" y 42. | ||
| - | ==== Métodos ==== | ||
| - | * ''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. | ||