Skip to content
Latchkey

O que é Concorrência? Gerenciar muitas coisas ao mesmo tempo

Concorrência é estruturar um programa para lidar com muitas tarefas que estão em andamento ao mesmo tempo, mesmo que apenas uma esteja de fato executando em cada instante.

Concorrência é uma forma de pensar sobre programas que fazem malabarismo com várias atividades, como atender muitos usuários, baixar vários arquivos ou rodar trabalho em segundo plano enquanto permanecem responsivos. As tarefas se sobrepõem no tempo, mas não necessariamente rodam no exato mesmo momento. Essa distinção, concorrência versus paralelismo, confunde muita gente.

O que concorrência realmente significa

Um programa concorrente é composto de tarefas que progridem independentemente. O sistema as intercala, alternando entre tarefas para que cada uma progrida. Em um único core, apenas uma roda de cada vez, mas todas estão "em voo", o que basta para manter um programa responsivo.

Concorrência vs paralelismo

Concorrência é sobre lidar com muitas coisas ao mesmo tempo (estrutura); paralelismo é sobre fazer muitas coisas ao mesmo tempo (execução). Você pode ter concorrência sem paralelismo (um core alternando tarefas) e paralelismo é uma forma de executar trabalho concorrente.

Formas de expressar concorrência

  • Threads que o OS escalona nos cores.
  • Async/await sobre um event loop para trabalho I/O-bound.
  • Coroutines que cedem controle cooperativamente.
  • Message-passing entre processos ou actors isolados.

A parte difícil: estado compartilhado

Quando tarefas concorrentes compartilham dados mutáveis, a ordenação importa e bugs como race conditions e deadlocks aparecem. Boa parte da disciplina de programação concorrente é sobre coordenar ou evitar estado compartilhado.

Um exemplo rápido

Um servidor web tratando mil conexões concorrentemente não precisa de mil cores; ele intercala as conexões, trabalhando naquela que tiver dados prontos, para que todas progridam.

Concorrência no CI

O CI usa concorrência intensamente: shards de teste em paralelo, jobs concorrentes e I/O sobreposto. Essa velocidade vem com bugs sensíveis a timing que aparecem como testes flaky. A Latchkey fornece ampla capacidade de runners concorrentes e dá retry automático em falhas transitórias enquanto você estabiliza testes genuinamente racy.

Principais conclusões

  • Concorrência é estruturar um programa em torno de muitas tarefas em andamento ao mesmo tempo.
  • Difere de paralelismo: concorrência é estrutura, paralelismo é execução simultânea.
  • Estado mutável compartilhado é onde vivem bugs de concorrência como races e deadlocks.

Guias relacionados