Slides preparados para o Rupy Campinas 2015 apresentando concurrent.futures e asyncio: dois modos de programação concorrente em Python sem precisar gerenciar threads manualmente.
1998 • Material dos cursos Objetos Pythonicos e Python para quem Sabe Python da Python.pro.br • Muito material novo • Early Release: out/2014 • First Edition: jul/2015 • Revisores técnicos: Alex Martelli, Anna Ravenscroft, Lennart Regebro e Leonardo Rochael
Data structures – Functions as objects – Classes and objects – Control flow – Metaprogramming • Edição brasileira: em 2015 • Código dos exemplos: – https://github.com/fluentpython/example-code
testes, desempenho de 4.7 a 4.9 vezes melhor com as versões concorrentes sequential thread pool asyncio test #1 6.58 1.36 1.25 test #2 6.42 1.27 1.32 test #3 6.50 1.59 1.50 test #4 6.48 1.05 1.67 test #5 6.56 1.42 1.25 average 6.51 1.34 1.40 factor 1.0 4.9 4.7
de AA a ZZ) • Baixar 194 imagens que existem • Scripts: – flags2_sequential.py: 5'45” – flags2_threadpool.py: 0'05” – flags2_asyncio.py: 0'04” • Desempenho 63 a 79 vezes melhor! sequential thread pool asyncio median 345.40s 5.41s 4.32s factor 1x 63x 79x
processos – threads (userland OS threads) • Única linha de execução – programação assíncrona ou orientada a eventos – interrupções de hardware – callbacks – co-rotinas – green threads • multi-tarefa cooperativa com threads implementadas em bibliotecas e não no OS; ex. gevent
difíceis na ciência da computação (geralmente, melhor evitar)” – David Beazley • “As pessoas que atacam threads em geral são systems programmers que estão pensando em casos de uso que o desenvolvedor de aplicações nunca encontrará. […] Em 99% dos casos o simples padrão de lançar um monte de threads independentes e juntar os resultados em uma fila é tudo o que se precisa saber” – Michele Simionato
manualmente – … ou callbacks • Concorrência moderna: – processos/threads gerenciados automaticamente – … ou callbacks refatorados: co-rotinas • Conceito unificador das duas abordagens modernas: – Future: encapsula uma tarefa pendente – Conhecido como Promise ou Deferred em outras bibliotecas
– disponível no PyPI para Python 2.5 ou superior • Encapsula o padrão descrito por Simionato: – disparar várias threads ou processos independentes em pool – reunir resultados em uma queue (fila) – gerencia automaticamente o pool e a queue • Mesma API para lidar com threads e processos – paralelismo de verdade com processos
avançar várias tarefas de modo concorrente, as abordagens assíncronas dependem de suporte do SO – Na prática, isso significa: • interrupções de hardware • processos e threads gerenciados pelo kernel ou por bibliotecas de baixo nível escritas em C • Porém, no código da aplicação temos apenas uma linha de execução – Essa é a idéia básica de Node.js, Twisted, Tornado e AsyncIO
paralelismo com concurrent.futures • asyncio oferece uma forma mais organizada de programar I/O orientado a eventos • Antes de considerar a hipótese de incluir outra linguagem no seu sistema Python 2.x que já está em produção, faça uma prova de conceito com Python 3.4 – não se trata de migrar o sistema todo, apenas desenvolver aquela parte que seria em Node ;-)