Herramientas de usuario

Herramientas del sitio


fw:gevent

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
fw:gevent [2013/07/04 16:44]
alfred [gevent]
fw:gevent [2020/05/09 09:25] (actual)
Línea 61: Línea 61:
  
 ===== gevent ===== ===== gevent =====
-Es una librería basada en concurrencia para aplicaciones asíncronas. \\ +  * Para instalarlo has de tener instalado en el operativo la librería ''​libevent-dev''​ 
 +  * [[http://​www.gevent.org/​contents.html|Documentación]] 
 + 
 +Es una librería basada en concurrencia ​por greenlets ​para desarrollar ​aplicaciones asíncronas, puede ser aprovechado es las funciones de network. \\ 
 El siguiente código: El siguiente código:
 <code python> <code python>
Línea 79: Línea 82:
 </​code>​ </​code>​
 ... Se ejecuta de la siguiente forma: \\  ... Se ejecuta de la siguiente forma: \\ 
-{{:​fw:​others:​flow.gif?​direct&​200|}}+{{:​fw:​others:​flow.gif?​direct&​200|}} ​ 
 +==== Méotodos ==== 
 +  * ''​gevent.spawn()''​ 
 +  * ''​gevent.joinall([gevents])'',​ detiene la ejecución del programa hasta que los greenlets no han acabado. 
 + 
 +==== Monkey patching ==== 
 +Es una técnica que consiste en substituir llamadas a elementos del sistema que son bloqueantes por otras que no lo son y, de esa forma, adaptar código antiguo al nuevo. \\  
 +Por ejemplo existe una substitución a ''​sleep''​. La de la librería básica bloquea el event loop mientras que ''​gevent.spleep''​ no . \\  
 +Módulos que han sido substituidos:​ //socket//, //ssl//, //os//, //time//, //select//, //thread // y //​threading//​. 
 + 
 + 
 + 
 +===== Ejemplos ===== 
 +=== Métodos síncronos y asíncronos === 
 + 
 +<code python>​ 
 +import gevent 
 +import random 
 + 
 +def task(pid):​ 
 +    """​ 
 +    Some non-deterministic task 
 +    """​ 
 +    gevent.sleep(random.randint(0,​2)*0.001) 
 +    print('​Task',​ pid, '​done'​) 
 + 
 +def synchronous():​ 
 +    for i in range(1,​10):​ 
 +        task(i) 
 + 
 +def asynchronous():​ 
 +    threads = [gevent.spawn(task,​ i) for i in xrange(10)] 
 +    gevent.joinall(threads) 
 + 
 +print('​Synchronous:'​) 
 +synchronous() 
 + 
 +print('​Asynchronous:'​) 
 +asynchronous() 
 +</​code>​ 
 +<​code>​ 
 +Synchronous:​ 
 +Task 1 done 
 +Task 2 done 
 +Task 3 done 
 +Task 4 done 
 +Task 5 done 
 +Task 6 done 
 +Task 7 done 
 +Task 8 done 
 +Task 9 done 
 +Asynchronous:​ 
 +Task 1 done 
 +Task 2 done 
 +Task 7 done 
 +Task 6 done 
 +Task 5 done 
 +Task 0 done 
 +Task 3 done 
 +Task 8 done 
 +Task 9 done 
 +Task 4 done 
 +</​code>​ 
 + 
 +=== Acceso a red asíncronamente === 
 +<code python>​ 
 +import gevent.monkey 
 +gevent.monkey.patch_socket() 
 + 
 +import gevent 
 +import urllib2 
 +import simplejson as json 
 + 
 +def fetch(pid):​ 
 +    response = urllib2.urlopen('​http://​json-time.appspot.com/​time.json'​) 
 +    result = response.read() 
 +    json_result = json.loads(result) 
 +    datetime = json_result['​datetime'​] 
 + 
 +    print '​Process ', pid, datetime 
 +    return json_result['​datetime'​] 
 + 
 +def synchronous():​ 
 +    for i in range(1,​10):​ 
 +        fetch(i) 
 + 
 +def asynchronous():​ 
 +    threads = [] 
 +    for i in range(1,​10):​ 
 +        threads.append(gevent.spawn(fetch,​ i)) 
 +    gevent.joinall(threads) 
 + 
 +print '​Synchronous:'​ 
 +synchronous() 
 + 
 +print '​Asynchronous:'​ 
 +asynchronous() 
 +</​code>​ 
 +===== Notas ===== 
 +==== ZeroMQ ==== 
 +Para hacer el paquete ''​pyzmq''​ compatible con los greenlets instalaremos el paquete ''​gevent-zeromq''​. A partir de entonces instanciaremos zeromq de la siguiente forma: 
 +<code python>​ 
 +from gevent_zeromq import zmq 
 +</​code>​
fw/gevent.1372956265.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)