0% encontró este documento útil (0 votos)
802 vistas

Corrutinas Asíncronas en Python

Notas para aprender a manejar lo básico de las corrutinas en Python. Ejemplos en https://gitlab.com/pineiden/async_coro Necesario usar Python > 3.4 Archivos usados en presentacion: example1.py example2.py example3.py loop_task5_multiprocess.py

Cargado por

pineiden
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
802 vistas

Corrutinas Asíncronas en Python

Notas para aprender a manejar lo básico de las corrutinas en Python. Ejemplos en https://gitlab.com/pineiden/async_coro Necesario usar Python > 3.4 Archivos usados en presentacion: example1.py example2.py example3.py loop_task5_multiprocess.py

Cargado por

pineiden
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 19

Corrutinas Asncronas

en Python (>3.4)
David Pineda Osorio
[email protected]
@pineiden
Diciembre 2016

No todo es secuencial...

Hay cosas que ocurren de manera aleatoria e


independiente
Es posible ocupar la CPU de manera intensiva

Fuente

El tradicional GIL de Python

Es un administrador general que gestiona la


secuencialidad de una ejecucin de python

El EventLoop de Asyncio

Da un paso ms all, tomando las riendas de la


ejecucin de las corrutinas, permitiendo realizar
multitareas mediante la gestin de envo y
recepcin de mensajes de eventos.

Fuente

Definicin de asyncio en PEP

PEP 492 https://www.python.org/dev/peps/pep-0492/

PEP 3156 https://www.python.org/dev/peps/pep-3156/

PEP 3153 https://www.python.org/dev/peps/pep-3153/

PEP 525 https://www.python.org/dev/peps/pep-0525/

PEP 492 https://www.python.org/dev/peps/pep-0492/

PEP 530 https://www.python.org/dev/peps/pep-0530/

Definen la sntaxis y principales funcionalidades que se habilitan con


asyncio.

Principales Caractersticas

Un eventloop con diversas implementaciones para


especificaciones de sistema
Abstracciones para una capa de Transporte y una de
Protocolo
Soporte networking TCP, UDP, UnixSocket, SSL,
subprocesos, pipes, etc

Sntaxis basada en yield from o await

Cancelacin de Futures o manager de corrutinas

Interface para trabajo con threads y procesos

Elementos Bsicos a Considerar

EventLoop: el gestor de ejecucin

Corrutinas: la funcin con sntaxis especial

Futures, Tasks: el gestor de ejecucin de cada corrutina

Conexiones: Objetos de red como sockets de distintos


tipos

Streams: elementos de comunicacin

Subprocesos: herramientas para uso de multiprocesos

Colas (Queues): Objetos para enviar elementos entre


corrutinas

En python 3.4
La llamada sera:
import asyncio
@asyncio
def coro_fun(input):
yield from accion()

loop=asyncio.get_event_loop()
loop.run_until_complete(coro_fun(1))

En python >3.5
La llamada sera:
import asyncio
async def coro_fun(input):
r=await f(input)
return r

loop=asyncio.get_event_loop()
loop.run_until_complete(coro_fun(1))

Ejemplo 1

Lo ms simple, una corrutina ejecutada en el


event-loop:
import asyncio
async def holacoro():
for i in range(3):
await asyncio.sleep(1)
print("Hola %d" % i)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
#creamos tarea y la asociamos al loop, ejecutandola
loop.run_until_complete(holacoro())

Ejemplo 2

Corrutinas ejecutadas secuencialmente


import asyncio
async def holacoro():
for i in range(3):
await asyncio.sleep(1)
print("Hola %d" % i)
async def chaocoro():
for i in range(3):
await asyncio.sleep(2)
print("Chao %d" % i)
async def doscoro():
await holacoro()
await chaocoro()

if __name__ == "__main__":
loop = asyncio.get_event_loop()
#creamos tarea y la asociamos al loop, ejecutandola
loop.run_until_complete(doscoro())

Ejemplo 3

Corrutinas ejecutadas independientes


import asyncio
async def holacoro():
for i in range(3):
await asyncio.sleep(1)
print("Hola %d" % i)
async def chaocoro():
for i in range(3):
await asyncio.sleep(2)
print("Chao %d" % i)
if __name__ == "__main__":
tasks=[
asyncio.ensure_future(holacoro()),
asyncio.ensure_future(chaocoro())
]
loop = asyncio.get_event_loop()
#creamos tarea y la asociamos al loop, ejecutandola
loop.run_until_complete(
asyncio.gather(*tasks)
)

Vamos con calma, Qu estamos


haciendo?: Un algoritmo
1) Crear corrutinas
2) Agendar la ejecucin de corrutinas mediante
Tasks
3) Iniciar un eventloop
4) Asociar Tasks a EventLoop

Future

Task

Veamos la documentacin de
Asyncio

MUY RECOMENDABLE ESTUDIARLA:


https://docs.python.org/3/library/asyncio.html

Future es una clase que provee una serie de mtodos que


permiten asociar la ejecucin de una corrutina a un eventloop.
Task es una clase que hereda de Future y aade algunas
funcionalidades especiales para la gestin de corrutinas.

Ejemplo 4
import asyncio
async def holacoro():
print("Hola %d" % 1)
await asyncio.sleep(1)
def renew(*args):
task=loop.create_task(holacoro())
task.add_done_callback(renew)
task=loop.create_task(holacoro())
task.add_done_callback(renew)
loop=asyncio.get_event_loop()
try:
loop.run_forever()
except KeyboardInterrupt:
print('Loop stopped')

Ejemplo 5
import asyncio
async def holacoro():
print("Hola %d" % 1)
await asyncio.sleep(1)
def renew(*args):
task=loop.create_task(holacoro())
task.add_done_callback(renew)
task=loop.create_task(holacoro())
task.add_done_callback(renew)
loop=asyncio.get_event_loop()
try:
loop.run_forever()
except KeyboardInterrupt:
print('Loop stopped')

Ejemplo 6: La potencia
asyncio+multiprocessing

Realiza Tasks de manera independiente en


procesadores distintos

if __name__ == "__main__":
loop = asyncio.get_event_loop()
executor=concurrent.futures.ProcessPoolExecutor()
v=1
b=1
gprint("Entrando a loop event")
future1=loop.run_in_executor(
executor,
functools.partial(hola_task,v))
future2=loop.run_in_executor(
executor,
functools.partial(chao_task,b))
tasks=[future1,future2]
loop.run_until_complete(asyncio.gather(*tasks))

Otros usos

Muy potente para el desarrollo de sistemas de


comunicacin en tiempo real.

1) Chats
2) Networking entre sockets
3) Mensajera
4) Clusters

Ms info

Dave Baezly
http://www.dabeaz.com/python.html
Bret Cannon
http://www.snarky.ca/how-the-heck-does-asyncawait-work-in-python-3-5
Mi gitlab https://gitlab.com/pineiden
Modulos adicionales hechos con asyncio
https://github.com/python/asyncio/wiki/ThirdPart
y

También podría gustarte