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:gevent [2013/07/04 16:56] alfred [gevent] |
fw:gevent [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 62: | Línea 62: | ||
| ===== gevent ===== | ===== gevent ===== | ||
| * Para instalarlo has de tener instalado en el operativo la librería ''libevent-dev'' | * 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 para aplicaciones asíncronas. Donde puede ser aprovechado es las funciones de network. \\ | + | 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 82: | Línea 83: | ||
| ... 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 ===== | + | ==== Méotodos ==== |
| * ''gevent.spawn()'' | * ''gevent.spawn()'' | ||
| * ''gevent.joinall([gevents])'', detiene la ejecución del programa hasta que los greenlets no han acabado. | * ''gevent.joinall([gevents])'', detiene la ejecución del programa hasta que los greenlets no han acabado. | ||
| - | ==== Ejemplos ==== | + | |
| + | ==== 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> | <code python> | ||
| Línea 134: | Línea 144: | ||
| Task 9 done | Task 9 done | ||
| Task 4 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> | </code> | ||