TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

29
tudo ao mesmo tempo agora PYTHON ASSÍNCRONO Programação concorrente sem tocar em threads ou callbacks

Transcript of TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

Page 1: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

t u d o a o m e s m o t e m p o a g o r a

PYTHON ASSÍNCRONOProgramação concorrente sem tocar em threads ou callbacks

Page 2: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

2

Sometimes you need a blank template.

Page 3: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

FLUENT PYTHON, MEU PRIMEIRO LIVRO

Fluent Python (O’Reilly, 2015)

Python Fluente (Novatec, 2015)

Python к вершинам мастерства* (DMK, 2015)

流暢的 Python† (Gotop, 2016)

also in Polish, Korean…

3

* Python. To the heights of excellence† Smooth Python

Page 4: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

CONCORRÊNCIANão é o mesmo que paralelismo!

4

Page 5: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

CONCORRÊNCIA X PARALELISMO

5

Rob Pike - 'Concurrency Is Not Parallelism' https://www.youtube.com/watch?v=cN_DpYBzKso

Page 6: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

GIRANDO 18 PRATOS COM APENAS 2 MÃOS

6

gIraNdo Pratos conco rrência Mo derNa eM PythON

https://speakerdeck.com/ramalho/await-em-python-3-dot-5

Page 7: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

FUNDAMENTOS PARA A CONCORRÊNCIA

• Interrupções de hardware

• Callbacks

• Threads (kernel, userland, green threads)

• Geradores

• Corrotinas

7

Page 8: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

DESFIANDO THREADS

• Seven Concurrency Models in Seven Weeks — When Threads Unravel (Paul Butcher)

• Abstrações mais poderosas • Actors, CSP, STM

• Data parallelism

• OpenCL (GPU)

• Lambda Architecture)

• Suporte nativo em linguagens • Erlang e Elixir

• Clojure

• Go

• Cilk8

Page 9: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

CONCORRÊNCIA APESAR DA GILSim, mesmo com a querida Global Interpreter Lock

9

Page 10: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

ALTERNATIVAS EM PYTHON

• Threads: OK para I/O de alto desempenho em escala limitada • Ver: Motor 0.7 Beta With Pymongo 2.9 And A Threaded Core

— A. Jesse Jiryu Davis — https://emptysqua.re/blog/motor-0-7-beta/

• Certas bibliotecas externas em Cython, C, C++, FORTRAN…

• Multiprocessing: múltiplas instâncias de Python

• Callbacks e deferreds em Twisted

• gevent: greenlets e monkey-patching

• Corrotinas em Tornado e Asyncio

10

Page 11: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

ASYNCIOO principal foco de desenvolvimento concorrente em Python hoje

11

Page 12: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

ASYNCIO

• Biblioteca criada por Guido van Rossum (originalmente: Tulip) • incorporada à biblioteca padrão no Python 3.4 como asyncio

• asyncio tem caráter provisional no Python 3.5 • API ainda instável

• status no Python 3.6…

• Eco-sistema muito ativo • por exemplo: https://github.com/aio-libs/

12

Page 13: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

13

Page 14: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

14

Page 15: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

15

Page 16: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

16

Page 17: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

17

Page 18: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

18

Page 19: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

LOOP DE EVENTOS PLUGÁVEL

• asyncio inclui um loop de eventos próprio

• API AbstractEventLoopPolicy permite substituir esse loop de eventos por outro que implemente AbstractEventLoop • AsyncIOMainLoop implementado pelo projeto Tornado

• Loop de eventos de toolkits para GUI: Quamash (PyQt4, PyQt5, PySide)

• Loops de eventos baseados na biblioteca libuv, base do Node.js

19

Page 20: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

UVLOOP

• Implementada com bindings em Cython sobre libuv • libuv é a biblioteca de I/O orientada a eventos do Node.js, usada também como

biblioteca externa em outras linguagens: C++, Lua, Julia, Python, Java, Go, PHP, C# etc.

• Criada por Yuri Selivanov, que criou a sintaxe async/await • PEP 492 — Coroutines with async and await syntax

20

Page 21: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

DESEMPENHO DO UVLOOP

Fonte: uvloop: Blazing fast Python networking — Yury Selivanov — 2016-05-03

https://magic.io/blog/uvloop-make-python-networking-great-again/21

Page 22: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

CORROTINAS NATIVASO principal foco de desenvolvimento concorrente em Python hoje

22

Page 23: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

NOVA SINTAXE ASYNC DEF

• PEP 492: Novas palavras reservadas em Python 3.5

• async def para definir corrotinas nativas

• Novas instruções (somente em corrotinas nativas):

• await para delegar para objetos awaitable • corrotinas nativas; geradores-corrotinas decoradas; implementam __await__

23

Page 24: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

ANTES E DEPOIS

24

Page 25: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

MAIS SUPORTE SINTÁTICO

• Ainda no PEP 492

• async for:métodos especiais assíncronos __aiter__ e __anext__

• async with:métodos especiais assíncronos __aenter__ e __aexit__

• Novidades do Python 3.6

• PEP 525: Asynchronous Generators

• PEP 530: Asynchronous Comprehensions (Python 3.6)

25

Page 26: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

CONCLUSÃOThe End

26

Page 27: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

MINHA OPINÃO

• Eco-sistema ainda jovem: bibliotecas em evolução • alguns exemplos do Fluent Python agora geram avisos

• asyncio com sua política extensível é uma base sólida para construir o futuro • loops de eventos externos demonstra isso (ex. uvloop, pyuv)

• Vamos logo migrar para Python 3.5!

27

Page 28: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

THE ONE (ABSTRACT) LOOP

28

Page 29: TDC2016POA | Trilha Python - Python Assíncrono: tudo ao mesmo tempo agora

¿PREGUNTAS?