Pergunta

Saudações,

Eu tenho estudado JavaScript, NodeJS. E não entendo como os problemas de simultaneidade são evitados em JavaScript.

Vamos dizer que estou trabalhando em um objeto

var bigObject = new BigObject();

e eu tenho um setTimer(function(){ workOnBigOjbect...} ) Isso também funcionará em bigOjbect.

Se eu tiver o disco io sendo escrito bigObject, e um objeto de timer trabalhando em bigObject, e codificar regularmente a leitura de bigObject, como os problemas de concorrência são evitados?

Em um idioma regular, eu usava um padrão de fila/comando mutex ou segura por threads. Também não vejo muita discussão sobre as condições de corrida para JavaScript.

Estou esquecendo de algo?

Foi útil?

Solução

O ponto principal do Node.js é que ele é orientado a eventos. Todo o código é executado nos manipuladores de eventos em um único thread. Não há problemas de simultaneidade porque o código não é executado simultaneamente. A desvantagem é que cada manipulador de eventos deve sair rapidamente, pois bloqueia os outros eventos.

No seu exemplo, o código iniciará o disco IO e sairá imediatamente. A infraestrutura Node.js notificará o programa de que a operação de IO foi concluída executando um manipulador de eventos. O evento do timer será chamado antes ou depois do evento de IO, mas nunca simultaneamente.

Outras dicas

JavaScript é um único thread. Se chegar o tempo em que sua função deve executar (com base em como você chamou o Settimer) e o código pai ainda está em execução, a função não será executada até que o código pai tenha concluído.

Existe apenas um único fio; Vejo: Node.js em máquinas de vários núcleos

Eu especularia que isso ocorre porque vários threads não são suportados no mecanismo JavaScript V8 subjacente, pois normalmente o JavaScript é executado em um navegador (onde em uma caixa do Windows existe apenas um único encadeamento da interface do usuário) e não suporta vários threads.

Há essa coisa em JavaScript chamado Correr para preenchimento O que garante que, se um código estiver executando, ele é executado completamente antes que qualquer outro código (assíncrono) seja executado, portanto, nenhum problema de simultaneidade.

No caso do seu exemplo, sempre que o retorno de chamada do timer for chamado, será executado completamente e nunca será antecipado no meio para executar algum outro código.

Ver Por que nenhuma ferramenta de controle de simultaneidade em JavaScript para mais detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top