JavaScript - questões orientadas para eventos e concorrência?
-
25-09-2019 - |
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?
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.