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

Python Assíncrono

Python Assíncrono

Uma leve introdução à programação assíncrona com Python

Avatar for Nilo Ney Coutinho Menezes

Nilo Ney Coutinho Menezes

August 12, 2017
Tweet

More Decks by Nilo Ney Coutinho Menezes

Other Decks in Programming

Transcript

  1. Assíncrono? • O que muda? • Suporte da linguagem •

    Vantagens • Onde usar • Como usar • Bibliotecas
  2. O que muda? • Modelo de execução diferente – CPU

    compartilhada entre várias tarefas – Código pára e volta a executar em função de notificações de entrada e saída • Multitarefa cooperativa • Tudo roda em um só thread
  3. Modelos de execução • Sequencial • Paralelo • A) threads

    • B) processos Tarefa 1 Tarefa 2 Tarefa 3 Tarefa 1 Tarefa 2
  4. Vantagens • Tudo roda em um só thread • Mais

    fácil de escrever que código multithread • Mais econômico que multiprocessos • Aproveita a capacidade de I/O e melhor utiliza a CPU disponível • Centenas de operações em um único programa
  5. Desvantagens • Tudo roda em um só thread • Código

    mais difícil de entender • Mais difícil de debugar
  6. Onde usar? • Problemas I/O bound – Rede (transferência de

    arquivos, DNS, etc) – Disco – Banco de dados – Problemas onde o tempo que se passa esperando pela entrada e/ou a saída é maior que o tempo de processamento
  7. Como funciona? • O loop de eventos gerencia quais tarefas

    devem executar • Quando código assíncrono é chamado, o loop de eventos passa o controle para esta função. • Quando está chama await ou retorna, o controle volta ao loop • O código é reativado quando um evento acontece, como I/O, timers, etc
  8. Como usar • Python >= 3.5 • Suporte a async/await

    • async declara métodos e funções assíncronas • await chama uma função assíncrona e espera seu retorno
  9. Como usar • PEP492 • Suporte a gerenciadores de contexto

    assíncronos (async with) – async def __aenter__(self) – async def __aexit__(self, exc_type, exc, tb) • async for – def __aiter__(self) – async def __anext__(self)