The Codest
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Indústrias
    • Fintech e Banca
    • E-commerce
    • Adtech
    • Tecnologia da saúde
    • Fabrico
    • Logística
    • Automóvel
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
  • Sobre nós
  • Serviços
    • Desenvolvimento de software
      • Desenvolvimento de front-end
      • Desenvolvimento backend
    • Staff Augmentation
      • Programadores Frontend
      • Programadores de back-end
      • Engenheiros de dados
      • Engenheiros de nuvem
      • Engenheiros de GQ
      • Outros
    • Aconselhamento
      • Auditoria e consultoria
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • A nossa equipa
  • Case Studies
  • Saber como
    • Blogue
    • Encontros
    • Webinars
    • Recursos
Carreiras Entrar em contacto
Seta para trás VOLTAR
2020-03-31
Desenvolvimento de software

Assíncrono e Single-threaded JavaScript?

Lukasz Kolko

JavaScript é uma linguagem single-threaded e, ao mesmo tempo, também non-blocking, assíncrona e concorrente. Este artigo explica-lhe como isso acontece.

  • Tempo de execução

JavaScript é uma linguagem interpretada e não compilada. Isto significa que precisa de um intérprete que converta a linguagem JS código para um código de máquina. Existem vários tipos de interpretadores (conhecidos como motores). Os motores de browser mais populares são o V8 (Chrome), o Quantum (Firefox) e o WebKit (Safari). A propósito, o V8 também é utilizado num runtime popular que não é de um navegador, Node.js.

Cada motor contém uma pilha de memória, uma pilha de chamadas, um ciclo de eventos, uma fila de retorno de chamada e uma WebAPI com pedidos HTTP, temporizadores, eventos, etc., tudo implementado à sua maneira para uma interpretação mais rápida e segura do código JS.

Desenvolvimento do JavaScript

Arquitetura básica de tempo de execução JS. Autor: Alex Zlatkov

Linha única

Uma linguagem single-thread é uma linguagem com uma única pilha de chamadas e uma única pilha de memória. Isto significa que só executa uma coisa de cada vez.

A pilha é uma região contínua de memória, que atribui um contexto local a cada função executada.

A pilha é uma região muito maior, que armazena tudo o que é atribuído dinamicamente.

A pilha de chamadas é uma estrutura de dados que basicamente regista o ponto em que nos encontramos no programa.

Pilha de chamadas

Vamos escrever um código simples e acompanhar o que está a acontecer na pilha de chamadas.

Desenvolvimento de software JavaScript

Como pode ver, as funções são adicionadas à pilha, executadas e posteriormente eliminadas. É a chamada forma LIFO - Last In, First Out (último a entrar, primeiro a sair). Cada entrada na pilha de chamadas é chamada de estrutura da pilha.

O conhecimento da pilha de chamadas é útil para ler os traços da pilha de erros. Geralmente, a razão exacta do erro está no topo da primeira linha, embora a ordem de execução do código seja de baixo para cima.

Por vezes, é possível lidar com um erro popular, notificado por Tamanho máximo da pilha de chamadas excedido. É fácil obter isto utilizando a recursão:

função foo() {
    foo()
}
foo()

e o nosso browser ou terminal bloqueia. Cada navegador, mesmo nas suas diferentes versões, tem um limite de tamanho de pilha de chamadas diferente. Na grande maioria dos casos, são suficientes e o problema deve ser procurado noutro local.

Pilha de chamadas bloqueada

Eis um exemplo de bloqueio da thread JS. Vamos tentar ler um bobo e um ficheiro bar utilizando o NóFunção síncrona .js readFileSync.

Código JavaScript

Este é um GIF em loop. Como pode ver, o motor JS espera até à primeira chamada em readFileSync está concluído. Mas isso não acontecerá porque não há bobo por isso a segunda função nunca será chamada.

Comportamento assíncrono

No entanto, o JS também pode ser não-bloqueante e comportar-se como se fosse multithread. Isto significa que não espera pela resposta de uma chamada à API, eventos de E/S, etc., e pode continuar a execução do código. Isto é possível graças aos motores JS que utilizam (sob o capô) linguagens multithreading reais, como C++ (Chrome) ou Rust (Firefox). Estas linguagens fornecem nós com a Web API sob as capas dos browsers ou ex. API de E/S no Node.js.

Linguagem de programação JavaScript

No GIF acima, podemos ver que a primeira função é empurrada para a pilha de chamadas e Hi é imediatamente executado na consola.

De seguida, chamamos o setTimeout função fornecida pela WebAPI do navegador. Vai para a pilha de chamadas e a sua chamada de retorno assíncrona bobo vai para a fila de espera do WebApi, onde aguarda a chamada, definida para acontecer após 3 segundos.

Entretanto, o programa continua o código e vemos Olá. Não estou bloqueado na consola.

Depois de ser invocada, cada função na fila da WebAPI vai para o Fila de retorno de chamada. É onde as funções esperam até que a pilha de chamadas esteja vazia. Quando isso acontece, elas são movidas para lá uma a uma.

Assim, quando o nosso setTimeout o temporizador termina a contagem decrescente, o nosso bobo vai para a fila de callbacks, espera até que a pilha de chamadas fique disponível, vai para lá, é executada e vemos Olá de uma chamada de retorno assíncrona na consola.

Ciclo de eventos

A questão é: como é que o tempo de execução sabe que a pilha de chamadas está vazia e como é que o evento na fila de retorno de chamada é invocado? Conheça o loop de eventos. Ele faz parte do mecanismo JS. Este processo verifica constantemente se a pilha de chamadas está vazia e, se estiver, monitoriza se existe um evento na fila de resposta à chamada à espera de ser invocado.

É toda a magia dos bastidores!

Conclusão da teoria

Concorrência e paralelismo

Concorrência significa a execução de várias tarefas ao mesmo tempo, mas não em simultâneo. Por exemplo, duas tarefas funcionam em períodos de tempo sobrepostos.

Paralelismo significa executar duas ou mais tarefas em simultâneo, por exemplo, efetuar vários cálculos ao mesmo tempo.

Tópicos e processos

Fios são uma sequência de execução de código que pode ser executada independentemente uma da outra.

Processo é uma instância de um programa em execução. Um programa pode ter vários processos.

Síncrono e assíncrono

Em síncrono Na programação, as tarefas são executadas uma após a outra. Cada tarefa aguarda que a tarefa anterior esteja concluída e só depois é executada.

Em assíncrono programação, quando uma tarefa é executada, é possível mudar para uma tarefa diferente sem esperar que a anterior seja concluída.

Síncrono e assíncrono num ambiente único e multi-threaded

Síncrono com um único segmento: As tarefas são executadas uma após a outra. Cada tarefa espera que a tarefa anterior seja executada.

Síncrono com vários threads: As tarefas são executadas em diferentes threads mas esperam por outras tarefas em execução em qualquer outra thread.

Assíncrono com um único thread: As tarefas começam a ser executadas sem esperar que uma tarefa diferente termine. Num determinado momento, apenas uma única tarefa pode ser executada.

Assíncrono com vários threads: As tarefas são executadas em diferentes threads sem esperar que outras tarefas sejam concluídas e terminam as suas execuções de forma independente.

Classificação JavaScript

Se considerarmos o funcionamento dos motores JS, podemos classificar o JS como uma linguagem interpretada assíncrona e single-threaded. A palavra "interpretada" é muito importante porque significa que a linguagem será sempre dependente do tempo de execução e nunca será tão rápida como as linguagens compiladas com multi-threading incorporado.

Vale ressaltar que o Node.js pode realizar multi-threading real, desde que cada thread seja iniciada como um processo separado. Existem bibliotecas para isso, mas o Node.js tem um recurso embutido chamado Fios de trabalho.

Todos os GIFs de loop de evento vêm do Lupas criada por Philip Roberts, onde pode testar os seus cenários assíncronos.

Ler mais:

Porque é que deve (provavelmente) utilizar Typescript?

A qualidade em primeiro lugar! 5 passos fáceis para aplicar lint ao seu código com fluxos de trabalho do GitHub no projeto JavaScript

Como melhorar as aplicações Vue.js? Algumas dicas práticas

Artigos relacionados

Ilustração de uma aplicação de cuidados de saúde para smartphone com um ícone de coração e um gráfico de saúde em ascensão, com o logótipo The Codest, representando soluções digitais de saúde e HealthTech.
Desenvolvimento de software

Softwares para o setor de saúde: Tipos, casos de uso

As ferramentas em que as organizações de cuidados de saúde confiam atualmente não se assemelham em nada às fichas de papel de há décadas atrás. O software de cuidados de saúde apoia agora os sistemas de saúde, os cuidados aos doentes e a prestação de cuidados de saúde modernos em...

OCODEST
Ilustração abstrata de um gráfico de barras em declínio com uma seta ascendente e uma moeda de ouro que simboliza a eficiência ou a poupança de custos. O logótipo The Codest aparece no canto superior esquerdo com o slogan "In Code We Trust" sobre um fundo cinzento claro
Desenvolvimento de software

Como dimensionar a sua equipa de desenvolvimento sem perder a qualidade do produto

Aumentar a sua equipa de desenvolvimento? Saiba como crescer sem sacrificar a qualidade do produto. Este guia cobre sinais de que é hora de escalar, estrutura da equipe, contratação, liderança e ferramentas - além de como o The Codest pode...

OCODEST
Desenvolvimento de software

Construir aplicações Web preparadas para o futuro: ideias da equipa de especialistas do The Codest

Descubra como o The Codest se destaca na criação de aplicações web escaláveis e interactivas com tecnologias de ponta, proporcionando experiências de utilizador perfeitas em todas as plataformas. Saiba como a nossa experiência impulsiona a transformação digital e o negócio...

OCODEST
Desenvolvimento de software

As 10 principais empresas de desenvolvimento de software sediadas na Letónia

Saiba mais sobre as principais empresas de desenvolvimento de software da Letónia e as suas soluções inovadoras no nosso último artigo. Descubra como estes líderes tecnológicos podem ajudar a elevar o seu negócio.

thecodest
Soluções para empresas e escalas

Fundamentos do desenvolvimento de software Java: Um Guia para Terceirizar com Sucesso

Explore este guia essencial sobre o desenvolvimento de software Java outsourcing com sucesso para aumentar a eficiência, aceder a conhecimentos especializados e impulsionar o sucesso do projeto com The Codest.

thecodest

Subscreva a nossa base de conhecimentos e mantenha-se atualizado sobre os conhecimentos do sector das TI.

    Sobre nós

    The Codest - Empresa internacional de desenvolvimento de software com centros tecnológicos na Polónia.

    Reino Unido - Sede

    • Office 303B, 182-184 High Street North E6 2JA
      Londres, Inglaterra

    Polónia - Pólos tecnológicos locais

    • Parque de escritórios Fabryczna, Aleja
      Pokoju 18, 31-564 Cracóvia
    • Embaixada do Cérebro, Konstruktorska
      11, 02-673 Varsóvia, Polónia

      The Codest

    • Início
    • Sobre nós
    • Serviços
    • Case Studies
    • Saber como
    • Carreiras
    • Dicionário

      Serviços

    • Aconselhamento
    • Desenvolvimento de software
    • Desenvolvimento backend
    • Desenvolvimento de front-end
    • Staff Augmentation
    • Programadores de back-end
    • Engenheiros de nuvem
    • Engenheiros de dados
    • Outros
    • Engenheiros de GQ

      Recursos

    • Factos e mitos sobre a cooperação com um parceiro externo de desenvolvimento de software
    • Dos EUA para a Europa: Porque é que as empresas americanas decidem mudar-se para a Europa?
    • Comparação dos centros de desenvolvimento da Tech Offshore: Tech Offshore Europa (Polónia), ASEAN (Filipinas), Eurásia (Turquia)
    • Quais são os principais desafios dos CTOs e dos CIOs?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Direitos de autor © 2026 por The Codest. Todos os direitos reservados.

    pt_PTPortuguese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese es_ESSpanish nl_NLDutch etEstonian elGreek cs_CZCzech pt_PTPortuguese