<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Iana Sampaio</title>
    <description>The latest articles on DEV Community by Iana Sampaio (@iana_sampaio).</description>
    <link>https://dev.to/iana_sampaio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3621205%2Fcf3227fa-aad5-490b-a765-32c0466807bd.jpeg</url>
      <title>DEV Community: Iana Sampaio</title>
      <link>https://dev.to/iana_sampaio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iana_sampaio"/>
    <language>en</language>
    <item>
      <title>Entendendo Sícrono vs Assíncrono: Threads, Await e Performance</title>
      <dc:creator>Iana Sampaio</dc:creator>
      <pubDate>Thu, 20 Nov 2025 18:09:27 +0000</pubDate>
      <link>https://dev.to/iana_sampaio/entendendo-sicrono-vs-assincrono-threads-await-e-performance-5ac3</link>
      <guid>https://dev.to/iana_sampaio/entendendo-sicrono-vs-assincrono-threads-await-e-performance-5ac3</guid>
      <description>&lt;p&gt;Conceitos como esses inevitavelmente aparecem na vida de quem desenvolve software. No começo, tudo parece confuso — e é normal. Você não precisa entender tudo de uma vez, quase ninguém entende. Mas maturar esses temas ao longo do tempo, sem fugir deles por medo da complexidade, é essencial.&lt;/p&gt;

&lt;p&gt;Você já se perguntou por que alguns aplicativos travam enquanto carregam algo, enquanto outros continuam funcionando normalmente? Ou por que certos servidores conseguem atender milhares de usuários ao mesmo tempo, enquanto outros ficam lentos com apenas dezenas? A resposta está na forma como o código lida com operações demoradas — e é isso que vamos entender agora.&lt;/p&gt;

&lt;p&gt;Neste artigo, quero esclarecer esses conceitos de forma direta e prática, para que sua jornada seja mais tranquila desde o início.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Antes de começar: o que é uma thread?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Uma &lt;strong&gt;thread&lt;/strong&gt; é como um "funcionário" do seu programa: ela pega uma tarefa, executa do início ao fim, e só depois pega outra. Seu servidor tem um número limitado dessas "threads trabalhadoras" disponíveis.&lt;/p&gt;

&lt;p&gt;Pense assim: se seu servidor tem 10 threads, ele consegue processar até 10 tarefas simultaneamente. Quando todas estão ocupadas, novas requisições precisam esperar na fila.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔵 &lt;strong&gt;1. Execução Síncrona: um passo de cada vez&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Na execução síncrona, o fluxo é linear:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inicia uma tarefa&lt;/li&gt;
&lt;li&gt;Espera concluir&lt;/li&gt;
&lt;li&gt;Só então passa para a próxima&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;É simples e previsível. Porém, carrega uma limitação importante: ele &lt;strong&gt;bloqueia&lt;/strong&gt; o andamento do restante do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que significa "bloquear"?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🚫 Operação bloqueante = a thread fica "travada", esperando a resposta
✅ Operação não-bloqueante = a thread pode fazer outras coisas enquanto espera

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Um jeito fácil de visualizar
&lt;/h3&gt;

&lt;p&gt;Pense em uma padaria onde o caixa atende &lt;strong&gt;uma única pessoa por vez&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Enquanto o cliente atual não finalizar a compra, ninguém mais avança na fila.&lt;/p&gt;

&lt;p&gt;Na programação, o efeito é idêntico: se uma operação leva 3 segundos, a &lt;strong&gt;thread&lt;/strong&gt; responsável por ela fica ocupada por 3 segundos — e nada mais anda nesse tempo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requisição 1: [████████████] 3s → Thread ocupada
Requisição 2:              [████████████] 3s → Aguardando...
Requisição 3:                           [████████████] 3s → Aguardando...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Quando o modelo síncrono funciona bem
&lt;/h3&gt;

&lt;p&gt;Ele é ideal para tarefas rápidas e diretas, como validações e operações puramente locais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essas ações são imediatas e não justificam mecanismos mais complexos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde começam os problemas
&lt;/h3&gt;

&lt;p&gt;O desempenho degrada quando o fluxo envolve operações &lt;strong&gt;lentas ou externas&lt;/strong&gt;, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chamadas de rede&lt;/li&gt;
&lt;li&gt;acesso a disco&lt;/li&gt;
&lt;li&gt;processamento pesado de CPU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine uma rota que precisa:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Receber a requisição&lt;/li&gt;
&lt;li&gt;Buscar informações no banco&lt;/li&gt;
&lt;li&gt;Gerar um relatório pesado (PDF/planilha)&lt;/li&gt;
&lt;li&gt;Salvar o arquivo&lt;/li&gt;
&lt;li&gt;Só então enviar a resposta
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/relatorio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;gerar_relatorio&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;dados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;buscar_dados_no_banco&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;     &lt;span class="c1"&gt;# I/O de rede — lento e bloqueante
&lt;/span&gt;    &lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;gerar_pdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# CPU intensiva — bloqueante
&lt;/span&gt;    &lt;span class="nf"&gt;salvar_no_storage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# I/O de disco — bloqueante
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pronto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Durante toda essa sequência, &lt;strong&gt;a mesma thread permanece ocupada&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;esperando o banco responder&lt;/li&gt;
&lt;li&gt;gerando o PDF&lt;/li&gt;
&lt;li&gt;salvando o arquivo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enquanto isso acontece, &lt;strong&gt;ela não pode atender mais nada&lt;/strong&gt;. Em um servidor com 10 threads, se 10 requisições pesadas chegarem ao mesmo tempo, o servidor &lt;strong&gt;trava a capacidade de atendimento&lt;/strong&gt; até que alguma thread fique livre.&lt;/p&gt;

&lt;h3&gt;
  
  
  O impacto em números
&lt;/h3&gt;

&lt;p&gt;Imagine que cada etapa demore 1 segundo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buscar dados: 1s&lt;/li&gt;
&lt;li&gt;Gerar PDF: 1s&lt;/li&gt;
&lt;li&gt;Salvar arquivo: 1s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: 3 segundos por requisição&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com 10 threads disponíveis, você atende no máximo 10 requisições simultaneamente. A 11ª pessoa precisa esperar 3 segundos inteiros antes de ser atendida. Se 100 pessoas acessam ao mesmo tempo, as últimas aguardam até 30 segundos!&lt;/p&gt;




&lt;h2&gt;
  
  
  🟢 &lt;strong&gt;2. Execução Assíncrona: avance enquanto a tarefa acontece&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Na execução assíncrona, o programa &lt;strong&gt;não fica parado&lt;/strong&gt; esperando tarefas lentas terminarem.&lt;/p&gt;

&lt;p&gt;Ele inicia uma operação, libera a thread e segue adiante.&lt;/p&gt;

&lt;p&gt;Quando o resultado chega, a execução retoma de onde parou.&lt;/p&gt;

&lt;h3&gt;
  
  
  Um jeito fácil de visualizar
&lt;/h3&gt;

&lt;p&gt;Imagine que você está na mesma padaria — mas agora ela trabalha com &lt;strong&gt;senha eletrônica e múltiplos atendimentos em paralelo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Você faz o pedido, recebe uma senha e é liberado para esperar.&lt;/p&gt;

&lt;p&gt;Enquanto isso, o caixa pode atender outras pessoas.&lt;/p&gt;

&lt;p&gt;Quando o seu pedido fica pronto, o sistema te chama:&lt;/p&gt;

&lt;p&gt;"Pedido 37, favor retirar".&lt;/p&gt;

&lt;p&gt;No mundo da programação, é exatamente isso que o modelo assíncrono faz: ele &lt;strong&gt;não bloqueia&lt;/strong&gt; enquanto o trabalho está sendo feito.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como isso funciona na prática
&lt;/h3&gt;

&lt;p&gt;Em vez de ocupar uma thread esperando uma operação lenta — como consulta ao banco ou chamada externa — o código "dispara" a tarefa e continua trabalhando.&lt;/p&gt;

&lt;p&gt;Quando a operação termina, um evento ou callback avisa:&lt;/p&gt;

&lt;p&gt;"ei, já terminei, pode continuar!".&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo com &lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Aqui está a mesma rota de geração de relatório, mas escrita de forma assíncrona:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/relatorio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;gerar_relatorio&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;dados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;buscar_dados_no_banco_async&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;gerar_pdf_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dados&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;salvar_no_storage_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pronto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  O que muda?
&lt;/h3&gt;

&lt;p&gt;Quando você marca uma função como &lt;code&gt;async&lt;/code&gt;, você está dizendo:&lt;/p&gt;

&lt;p&gt;“essa função pode ser pausada enquanto espera operações demoradas”.&lt;/p&gt;

&lt;p&gt;E é isso que permite ao await funcionar da forma correta.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que o &lt;code&gt;await&lt;/code&gt; realmente faz?
&lt;/h3&gt;

&lt;p&gt;Ele é como um "pausa inteligente":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sinaliza: "essa operação vai demorar, não me espere aqui"&lt;/li&gt;
&lt;li&gt;Libera a thread para fazer outras coisas&lt;/li&gt;
&lt;li&gt;Quando a operação termina, retoma exatamente de onde parou&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É diferente de simplesmente "esperar" — é esperar &lt;strong&gt;sem desperdiçar recursos&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  O ganho em números
&lt;/h3&gt;

&lt;p&gt;Com o mesmo cenário anterior (operações de 1s cada):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O servidor inicia a consulta ao banco e &lt;strong&gt;libera a thread&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enquanto o banco processa, essa mesma thread atende outras 10 pessoas&lt;/li&gt;
&lt;li&gt;Quando o banco responde, o servidor retoma de onde parou&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resultado:&lt;/strong&gt; 100+ requisições sendo processadas "ao mesmo tempo" com apenas 10 threads!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso permite que um único servidor lide com &lt;strong&gt;muito mais requisições simultâneas&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que acontece com as threads?
&lt;/h3&gt;

&lt;p&gt;Em sistemas assíncronos, você não precisa de "1 thread por requisição".&lt;/p&gt;

&lt;p&gt;Em vez disso:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 thread → milhares de requisições aguardando respostas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Isso é possível porque as threads só trabalham quando &lt;strong&gt;têm algo de fato para executar&lt;/strong&gt; — não ficam bloqueadas esperando respostas externas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requisição 1: [██--await--██--await--██]
Requisição 2:   [██--await--██--await--██]
Requisição 3:     [██--await--██--await--██]
                    ↑ Thread livre entre operações

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🟡 &lt;strong&gt;3. E as filas de mensagens?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Filas (como RabbitMQ, Redis Queue, AWS SQS) são outra forma de lidar com operações lentas — e complementam muito bem os modelos anteriores:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A requisição chega&lt;/li&gt;
&lt;li&gt;Você envia a tarefa para uma fila&lt;/li&gt;
&lt;li&gt;Responde imediatamente: "ok, vou processar isso"&lt;/li&gt;
&lt;li&gt;Um worker consome a fila e executa quando puder&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Quando usar filas?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando você pode responder "recebi!" sem precisar do resultado na hora&lt;/li&gt;
&lt;li&gt;Para processos que podem ser executados em background&lt;/li&gt;
&lt;li&gt;Quando precisa garantir que tarefas não sejam perdidas mesmo se o servidor cair&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/enviar-email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;enviar_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;destinatario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Em vez de enviar o email agora (lento)
&lt;/span&gt;    &lt;span class="n"&gt;fila&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;adicionar_tarefa&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tipo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;destinatario&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;destinatario&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mensagem&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email agendado&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# Resposta instantânea!
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enquanto isso, workers separados processam a fila em segundo plano.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ &lt;strong&gt;4. Quando o assíncrono NÃO resolve&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Operações que &lt;strong&gt;realmente usam CPU continuamente&lt;/strong&gt; (como processar imagens, cálculos matemáticos pesados, encoding de vídeo) não se beneficiam muito do async/await. Por quê?&lt;/p&gt;

&lt;p&gt;Porque async funciona bem para operações de &lt;strong&gt;espera&lt;/strong&gt; (I/O), não para operações que exigem &lt;strong&gt;processamento contínuo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Isso NÃO vai melhorar com async
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;processar_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;converter_codec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Ainda usa 100% da CPU
&lt;/span&gt;    &lt;span class="c1"&gt;# A thread não fica "livre" porque a CPU está trabalhando full time
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para esses cenários, considere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usar workers em processos separados&lt;/li&gt;
&lt;li&gt;Delegar para serviços especializados&lt;/li&gt;
&lt;li&gt;Usar múltiplos servidores/containers&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusão&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A execução síncrona e a execução assíncrona resolvem problemas diferentes e, por isso, &lt;strong&gt;ambas têm seu lugar&lt;/strong&gt; no desenvolvimento moderno.&lt;/p&gt;

&lt;p&gt;O modelo síncrono é direto, fácil de entender e funciona muito bem para tarefas rápidas e previsíveis. Mas, à medida que o sistema começa a lidar com operações lentas — como chamadas externas, processamento pesado ou acesso a disco — ele rapidamente se torna um gargalo. Cada thread ocupada é uma requisição que deixa de ser atendida.&lt;/p&gt;

&lt;p&gt;A execução assíncrona surge justamente para evitar esse desperdício. Ela permite que o servidor continue trabalhando enquanto tarefas demoradas acontecem em segundo plano, liberando threads, aumentando o throughput e tornando o sistema muito mais escalável.&lt;/p&gt;

&lt;p&gt;No fim, compreender a diferença entre esses modelos não é apenas um detalhe técnico: é uma habilidade essencial para arquitetar APIs, microserviços e aplicações modernas que precisam lidar com alto volume de tráfego e eficiência.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Se o sincronismo garante simplicidade, o assincronismo entrega performance.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E o papel do desenvolvedor é saber &lt;strong&gt;qual modelo escolher — e quando&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>síncrono</category>
      <category>assíncrono</category>
      <category>async</category>
    </item>
  </channel>
</rss>
