Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Girando Pratos: concorrência moderna em Python

Girando Pratos: concorrência moderna em Python

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.

Luciano Ramalho

June 20, 2015
Tweet

More Decks by Luciano Ramalho

Other Decks in Technology

Transcript

  1. Fluent Python • Coisas que aprendi trabalhando com Python desde

    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
  2. Python Fluente • Mais de 700 páginas • Partes: –

    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
  3. Download de imagens: tempos • Para 20 downloads em 5

    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
  4. Download de imagens: tempos (B) • Acessar 676 URLS (imagens

    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
  5. Concorrência ≠ paralelismo • Concorrência é manejar várias tarefas ao

    mesmo tempo • Paralelismo é executar várias tarefas ao mesmo tempo Definições de Rob Pike Definições de Rob Pike
  6. Concorrência é mais importante • Um computador moderno tem 4

    CPUs, porém rotineiramente gerencia mais de 100 processos ao mesmo tempo. • Concorrência é um pré- requisito para conseguir paralelismo.
  7. Formas de obter concorrência • Múltiplas linhas de execução: –

    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
  8. Repensando concorrência c/ threads • “Concorrência: um dos tópicos mais

    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
  9. Concorrência moderna em Python • Concorrência clássica: – gerenciar processos/threads

    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
  10. Pacote concurrent.futures • Incluído na biblioteca padrão no Python 3.2

    – 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
  11. Concorrência com uma linha de execução? Como? • Para conseguir

    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
  12. Conclusão • É simples resolver problemas simples de concorrência e

    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 ;-)