Herramientas de usuario

Herramientas del sitio


fw:gevent

¡Esta es una revisión vieja del documento!


Greenlet & gevent

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.

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()

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

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.

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.

gevent

Es una librería basada en concurrencia para aplicaciones asíncronas.
El siguiente código:

import gevent
def foo():
    print('Running in foo')
    gevent.sleep(0)
    print('Explicit context switch to foo again')
def bar():
    print('Explicit context to bar')
    gevent.sleep(0)
    print('Implicit context switch back to bar')
gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(bar),
])

… Se ejecuta de la siguiente forma:

fw/gevent.1372956265.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)