Article image
Fernanda Araujo
Fernanda Araujo23/06/2025 12:00
Compartilhe

Paradigmas de Linguagens de Programação em Python: Python concorrente (Part. 11)

    Em sua jornada para descobrir a verdade sobre o Século Perdido, Nico Robin não percorre o mundo sozinha. Enquanto ela decifra um Poneglyph em uma ilha, outros Chapéus de Palha enfrentam inimigos, coletam pistas ou protegem a embarcação. Todos executam tarefas simultâneas e interdependentes, contribuindo para um objetivo comum: encontrar a verdadeira história do mundo.

    Essa divisão de tarefas espelha o que chamamos de programação concorrente — um paradigma onde várias atividades são executadas em paralelo ou intercaladas, acelerando o progresso, otimizando recursos e enfrentando desafios complexos de forma colaborativa.

    🔎 O que é Programação Concorrente?

    A programação concorrente é um paradigma voltado para a execução simultânea ou coordenada de múltiplas tarefas, com o objetivo de:

    • Acelerar o processamento
    • Melhorar a eficiência de sistemas
    • Responder a múltiplos eventos ao mesmo tempo (ex: requisições de usuários)

    Essa abordagem não significa necessariamente que tudo está rodando ao mesmo tempo fisicamente (isso seria paralelismo), mas sim que tarefas compartilham recursos e tempo de execução, como se cada uma estivesse esperando sua vez para agir — sem bloquear o progresso geral.

    🧠 A metáfora com Robin e os Chapéus de Palha

    Enquanto Robin estuda os símbolos antigos em Zou, Luffy luta contra Kaido em Wano, Franky repara o navio, e Nami analisa rotas climáticas. Cada membro trabalha em paralelo, e o progresso de cada um contribui para o avanço do todo.

    Na linguagem da programação, diríamos que cada personagem representa uma thread, um processo ou uma corrotina — e a tripulação inteira está operando concorretemente, resolvendo partes da missão sem que uma precise esperar pela outra.

    ⚙️ Formas de concorrência em Python

    Python oferece diversas formas de escrever programas concorrentes, cada uma com suas características:

    TécnicaDescrição brevethreadingExecuta várias tarefas ao mesmo tempo na mesma memóriamultiprocessingExecuta processos separados (em múltiplos núcleos)asyncioTarefas assíncronas com corrotinas (leve, não-bloqueante)concurrent.futuresInterface de alto nível para threading e multiprocessing

    💻 Exemplo 1 — threading: cada membro em ação

    python
    
    import threading
    import time
    
    def ler_poneglyph(nome, tempo):
      print(f"{nome} começou a estudar um Poneglyph...")
      time.sleep(tempo)
      print(f"{nome} terminou de decifrar!")
    
    # Threads paralelas
    robin = threading.Thread(target=ler_poneglyph, args=("Robin", 4))
    franky = threading.Thread(target=ler_poneglyph, args=("Franky", 2))
    
    robin.start()
    franky.start()
    
    robin.join()
    franky.join()
    

    🌀 Aqui, Robin e Franky estudam diferentes Poneglyphs simultaneamente. A função join() garante que esperemos ambos terminarem antes de seguir o programa.

    💻 Exemplo 2 — asyncio: Robin gerenciando múltiplos textos ao mesmo tempo

    python
    
    import asyncio
    
    async def decifrar_texto(ilha, tempo):
      print(f"🗿 Robin começou a ler o Poneglyph de {ilha}")
      await asyncio.sleep(tempo)
      print(f"✅ Robin terminou o Poneglyph de {ilha}")
    
    async def main():
      await asyncio.gather(
          decifrar_texto("Zou", 3),
          decifrar_texto("Wano", 2),
          decifrar_texto("Alabasta", 1)
      )
    
    asyncio.run(main())
    

    ⚡ Nesse modelo, Robin lida com múltiplas leituras assíncronas sem bloquear a execução — como se ela coordenasse diferentes traduções ao mesmo tempo em ritmo leve.

    🧩 Concorrência x Paralelismo

    image

    📚 Quando usar concorrência em Python?

    • Quando seu programa precisa responder a vários eventos ao mesmo tempo
    • Quando há tarefas demoradas ou de I/O (espera de rede, arquivos, etc.)
    • Quando dividir tarefas pode acelerar a execução (ex: crawlers, chatbots, análise de dados)
    • Quando há tarefas independentes que podem ser organizadas como corrotinas

    🔚 Conclusão

    A programação concorrente nos ensina a pensar em múltiplas frentes ao mesmo tempo, como uma equipe que divide suas responsabilidades para atingir um objetivo maior com mais eficiência.

    Em vez de executar tarefas em sequência rígida, o paradigma concorrente permite que atividades compartilhem o tempo de execução. Isso significa que, enquanto uma tarefa espera (como acessar um arquivo, consultar uma API ou processar dados pesados), outra pode usar esse tempo ocioso para avançar. O resultado? Menos tempo desperdiçado, mais fluidez e maior desempenho.

    Na prática, isso é extremamente útil em aplicações reais: servidores que atendem muitos usuários, bots que monitoram várias conversas ao mesmo tempo, análises em lote, robôs que interagem com sensores e atuadores simultaneamente, ou qualquer sistema que lide com múltiplas tarefas que não dependem umas das outras diretamente.

    A analogia perfeita é a jornada da Nico Robin com os Chapéus de Palha.
    Enquanto Robin decifra um Poneglyph com toda sua atenção, Luffy luta, Nami calcula as rotas e Franky conserta o navio. Cada um atua de forma independente, mas todos caminham para um destino comum. Nenhum deles precisa parar para que o outro avance — e, justamente por isso, o progresso da tripulação é acelerado.

    Assim também funciona o Python concorrente: ele permite que diferentes partes do código trabalhem juntas, mas de forma autônoma, como threads, processos ou tarefas assíncronas — cooperando, sem bloquear umas às outras.

    Quando usamos threading, multiprocessing, ou asyncio, estamos colocando o nosso programa para funcionar como uma tripulação sincronizada: cada parte executando sua missão, mas sem comprometer o todo.

    Entender e aplicar concorrência em Python é como montar um plano inteligente de ação — distribuído, leve e eficiente. É programar com a mentalidade de uma equipe que pensa, age e conquista simultaneamente.

    Compartilhe
    Comentários (1)
    DIO Community
    DIO Community - 23/06/2025 17:05

    Fernanda, o artigo sobre Programação Concorrente em Python ficou excelente! Você fez uma ótima analogia com a Nico Robin e os Chapéus de Palha, tornando o conceito de concorrência muito mais acessível e intuitivo. Usar essa metáfora para explicar como tarefas independentes podem avançar simultaneamente é uma maneira criativa e eficaz de ensinar um conceito tão técnico.

    Eu gostei muito da clareza ao apresentar as diferentes formas de concorrência em Python, como threading, asyncio e multiprocessing. A explicação sobre o uso de asyncio para tarefas assíncronas e a comparação entre concorrência e paralelismo também foram bem feitas. Sua abordagem permite que iniciantes no tema consigam entender como organizar e dividir tarefas de maneira eficiente.

    Minha pergunta para você é: em quais tipos de aplicações você acredita que o uso de concorrência em Python pode ser mais vantajoso em comparação com o uso de programação sequencial? Existem casos específicos onde você recomendaria fortemente o uso de concorrência para melhorar a performance ou a escalabilidade?