python async
TRANSCRIPT
PYTHON ASYNCLEONARDO ROSSETTI
PYTHON ASYNC
WHOAMI
▸ Leonardo Rossetti
▸ @odranoel
▸ Python since 2007
▸ Fundador da Goldark (http://www.goldark.com.br)
▸ 100% python
▸ Plataforma e desenvolvimento de backend
▸ Arquitetura de microservices
PYTHON ASYNC
ASSINCRONISMO
▸ Single-thread
▸ I/O concurrency
▸ Non-blocking sockets
▸ epoll/kqueue
▸ Event loop
▸ http://kegel.com/c10k.html
PYTHON ASYNC
ASYNC - MOTIVAÇÕES (POSSÍVEIS)
▸ backend está lento (requisições)
▸ muitas conexões simultâneas
▸ uso de web sockets (ou algo semelhante)
▸ se o se problema for relacionado a processamento/cpu
▸ algum driver usado não é async
▸ não é um canivete suíço
PYTHON ASYNC
ASSINCRONISMO - COMPARAÇÕESSingle Threaded
Tem
po d
e ex
ecuç
ão
Multi Threaded Async/Event DrivenTask 1
Task 2
Task 3
PYTHON ASYNC
ASYNC FRAMEWORKS
▸ Twisted
▸ Tornado
▸ Gevent
PYTHON ASYNC
FRAMEWORKS - TWISTED
▸ event driven engine & reactor pattern
▸ HTTP, TCP, UDP, IRC, FTP, IMAP, etc
▸ Lançado em 2002
▸ zeromq + twisted = http://txzmq.readthedocs.org/en/latest/
▸ curva de aprendizado consideravelmente alta
▸ necessário o uso de callbacks
PYTHON ASYNC
FRAMEWORKS - TORNADO
▸ Criado pelo friendfeed
▸ Suporta HTTP, TCP e Websockets
▸ Pode usar o event loop do asyncio, gevent ou twisted
▸ Suporta coroutines e callbacks
▸ Foco em suportar o maior número de requisições simultâneas
▸ Suporte a alguns drivers como do MongoDB (Motor e MotorEngine)
▸ Future Tasks com yield
PYTHON ASYNC
FRAMEWORKS - GEVENT
▸ engine com base no libev
▸ coroutines baseadas em greenlets
▸ melhor maneira de tornar um código escrito sincronamente em async
▸ Suporte a monkey patch em diversos projetos como flask, pymongo etc
▸ Não é suportado no pypy :(
PYTHON ASYNC
FRAMEWORKS - GEVENT (PYMONGO)
PYTHON ASYNC
ASYNCIO
▸ pep 3156(tulip)
▸ stdlib >= python 3.4
▸ std event loop
▸ coroutines, await e async keywords >= python 3.5
▸ Não é mais necessário reinventar a roda a cada framework/lib async
PYTHON ASYNC
ASYNCIO - AIOHTTP
▸ asyncio não possui uma interface padrão para http
▸ aiohttp comes to the rescue: http://aiohttp.readthedocs.org/en/stable/
▸ Simple server API:
▸ middlewares (interfere no web handler)
▸ signals (interfere na requisição, muda headers, parse no corpo http, etc)
▸ suporte as novas features do asyncio do python 3.5
▸ low level API: implemente seu próprio HTTP Server
PYTHON ASYNC
Obrigado!