Síncrono vs Assíncrono (Sync vs Async)
Definição
A diferença entre síncrono e assíncrono está em como o programa lida com tarefas que envolvem espera, como leitura de arquivos, chamadas de rede ou timers.
Em um código síncrono, as tarefas são executadas uma de cada vez, na ordem em que aparecem no código.
Cada operação precisa terminar antes que a próxima comece.Em um código assíncrono, as tarefas não bloqueiam a execução principal. Elas podem ser agendadas para serem finalizadas no futuro, enquanto o restante do código continua sendo executado.
Objetivos do modelo assíncrono
- Evitar travamentos em tarefas demoradas (como chamadas de rede ou leitura de disco).
- Manter aplicações responsivas, especialmente em interfaces gráficas ou servidores.
- Permitir execução de múltiplas tarefas ao mesmo tempo, sem esperar cada uma terminar antes de iniciar a próxima.
Exemplo prático: diferença na ordem de execução
Código síncrono
function tarefaSincrona() {
console.log("1. Início");
console.log("2. Processando...");
console.log("3. Fim");
}
tarefaSincrona();
Saída:
1. Início
2. Processando...
3. Fim
A execução é sequencial e previsível. Cada linha só roda depois que a anterior termina.
Código assíncrono
function tarefaAssincrona() {
console.log("1. Início");
setTimeout(() => {
console.log("3. Processando... (após 2s)");
}, 2000);
console.log("2. Fim");
}
tarefaAssincrona();
Saída:
1. Início
2. Fim
3. Processando... (após 2s)
Neste caso, o setTimeout
agenda a tarefa para o futuro, permitindo que o programa continue executando o restante do código imediatamente.
ℹ️ Isso mostra que, no modelo assíncrono, a ordem visual do código nem sempre reflete a ordem real de execução.
Exemplos com retorno de valor
Código síncrono com retorno direto
function obterValorSincrono() {
return "valor imediato";
}
const resultado = obterValorSincrono();
console.log("Resultado:", resultado);
Saída:
Resultado: valor imediato
Código assíncrono com callback
function obterValorAssincrono(callback) {
setTimeout(() => {
callback("valor após espera");
}, 1000);
}
obterValorAssincrono((resultado) => {
console.log("Resultado (assíncrono):", resultado);
});
Saída:
Resultado (assíncrono): valor após espera
Aqui, o valor não está disponível imediatamente.
O resultado é entregue via callback, quando a tarefa assíncrona termina.
O ciclo assíncrono
[Requisição feita]
↓
[Evento assíncrono é agendado]
↓
[Execução principal continua]
↓
[Resultado é tratado quando estiver pronto]
Esse modelo é especialmente útil em:
- Aplicações web
- Interfaces gráficas
- Servidores de alta concorrência
- Qualquer sistema que interaja com I/O externo (banco de dados, rede, arquivos)
Quando usar cada um
A escolha entre execução síncrona e assíncrona depende do tipo de tarefa envolvida:
Situação | Melhor abordagem |
---|---|
Operações rápidas e determinísticas | Síncrona |
Tarefas de rede ou I/O | Assíncrona |
Interfaces e sistemas reativos | Assíncrona |
Algoritmos lineares simples | Síncrona |
ℹ️ Em linguagens modernas como JavaScript, Python (com asyncio), C# e Rust, o modelo assíncrono é amplamente adotado para tarefas que envolvem espera.