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

Modelos de concorrência e paralelismo em Python

Modelos de concorrência e paralelismo em Python

Overview sobre modelos de concorrência e paralelismo em Python.

Diego Garcia

February 03, 2017
Tweet

More Decks by Diego Garcia

Other Decks in Technology

Transcript

  1. Diego Garcia Na Vida: • Pai • Punk • Programador

    nas horas vagas (Python, Golang, etc.) No Labs: • Backend developer (plataforma/catálogo) • SRE
  2. Concorrência diz respeito a lidar com muitas coisas ao mesmo

    tempo. Paralelismo diz respeito a fazer muitas coisas ao mesmo tempo. Rob Pike Co-Inventor da linguagem Go
  3. GIL "Mecanismo utilizado pelo interpretador CPython para garantir que somente

    uma thread execute o bytecode Python por vez." "Isso simplifica a implementação da CPython por tornar o modelo de objetos implicitamente seguro contra acessos concorrentes. "[...] O GIL é sempre liberado quando ocorrem operações de I/O." Glossário: Termo Global Interpreter Lock Documentação oficial do Python 3
  4. Threads Prós • Compartilham o mesmo contexto e espaço de

    memória da aplicação. • Permite trabalhar com paralelismo e/ou concorrência. • Pouco pra médio overhead. • Excelente para operações de I/O. Contras • GIL (o mesmo da main thread). • Race conditions. • Não é efetivo para operações de CPU bound. • Adiciona uma camada de complexidade na aplicação (para testar, gerenciar, monitorar, etc).
  5. Sugestões de uso para Threads • Múltiplas chamadas HTTP independentes

    em uma aplicação blocante (django, bottle, flask, etc). • Processamentos de I/O em workers (e.g. celery). • Event watchers. • etc.
  6. Processos Prós: • Concorrência a nível de processador. • Real

    paralelismo. • Sem GIL (cada processo possui o seu). • Excelente para operações de CPU bound. Contras: • Overhead muito alto. • Não compartilha o mesmo espaço de memória da aplicação. • Serialização do contexto usando pickle no momento do fork do processo. • Adiciona uma camada de complexidade (maior do que threads) na aplicação (para testar, gerenciar, monitorar, etc).
  7. Sugestões de uso para processos • Criação e gerenciamento de

    Workers (e.g. celery, gunicorn). • Processamentos pesados de CPU bound. • etc.
  8. Async Prós: • Concorrência a nível máximo (uso efetivo de

    CPU) • Pouco overhead. • Pouca complexidade (programe como se fosse sync [ou quase]) Contras: • Depende de um Event Loop. • Novos idiomas e paradigmas (await, async, yield from, gather, etc). • Não é efetivo para operações de CPU bound (somente I/O). • Hype (abusos).
  9. Sugestões de uso de Async. • Aplicações web com muitas

    dependências externas (outras API). • Aplicações web com dependências externas lentas. • Criação e gerenciamento de Workers baseados em socket (e.g. nginx, gunicorn, etc.). • Scripts com múltiplos consumos de I/O (e.g. geração de relatório)
  10. Use Processos para operações de CPU Bound Mas avalie muito

    bem antes, se realmente é necessário
  11. Use Async para web-services Mas só se você fizer muitas

    requisições externas (principalmente se forem demoradas)