Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

307
Visualizações
Clúster node.js, redirigiendo la salida estándar del niño a datos de ruptura de archivos

La tarea es:

  1. Clúster crea trabajadores
  2. Cada trabajador carga algunos datos remotos línea por línea y los envía a su propio proceso.stdout
  3. La salida de todo el clúster se redirige al archivo

Resultado esperado: todas las líneas de todos los trabajadores se concatenan en el archivo resultante

Resultado real: en algunas máquinas el resultado es el esperado, en otras el resultado es entrelazado.

Probado en nodos 0.10.47 y 0.12.7 bajo Ubuntu OS. En dos máquinas con Ubuntu 16.04.2, el resultado es bueno. En uno bajo Ubuntu 14.04.5 está entrelazado.

Necesito ayuda para entender esta situación y arreglarla el 14.04.

clúster.js:

 var cluster = require("cluster"); cluster.setupMaster({ exec: "./worker.js" }); cluster.fork(); cluster.fork();

trabajador.js:

 var cluster = require("cluster"); var fs = require("fs"); var workerId = cluster.worker && cluster.worker.id || 1; var stream = fs.createReadStream("./data" + workerId + ".log"); stream.on("end", function () { process.exit(); }); stream.pipe(process.stdout);

Necesita dos archivos en la misma carpeta llamados data1.log y data2.log con datos para leer:

 $ wc -l data* 9260 data1.log 111636 data2.log 120896 total

La tubería siempre da buen resultado:

 $ node cluster.js | wc -l 120896

La redirección al archivo da buenos resultados solo en Ubuntu 16.04 pero nunca en Ubuntu 14.04. Aún más en Ubuntu 14.04 da cada vez resultados diferentes:

 $ node cluster.js >result.log; wc -l result.log 114135 <= MUST BE 120896 $ node cluster.js >result.log; wc -l result.log 110136 <= MUST BE 120896

La redirección al archivo de adición siempre da buenos resultados:

 $ rm result.log $ node cluster.js >>result.log; wc -l result.log 120896

Tenga en cuenta que el archivo resultante es menor que el original. Tiene menos líneas e incluso menos bytes. Entonces supongo que las líneas de diferentes trabajadores se están reescribiendo entre sí.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

En general, debe evitar llamar a process.exit() debido a los problemas que puede causar cuando tiene datos almacenados en búfer para enviarlos a alguna parte. process.exit() finaliza el proceso casi inmediatamente.

En este caso particular, bien podría ser que process.stdout no haya vaciado completamente su búfer interno (para cuando las escrituras de process.stdout son asíncronas ) antes de que finalice el proceso.

Mi sugerencia sería permitir que el proceso de trabajo salga naturalmente simplemente desconectando el canal IPC (no utilizado) en el trabajador a través de process.disconnect() y eliminando el process.exit() en el trabajador. Esto debería permitir que process.stdout se drene/vacíe por completo antes de que finalice el proceso.

over 4 years ago · Santiago Trujillo Relatório

0

Para solucionar el problema, se debe establecer explícitamente el modo de canalización en el código maestro:

 var cluster = require("cluster"); cluster.setupMaster({ exec: "./worker.js", => silent: true }); for (var i = 0; i &lt; 2; i++) { var worker = cluster.fork(); => worker.process.stdout.pipe(process.stdout); => worker.process.stderr.pipe(process.stderr); }

Creo que la razón de tales diferencias en el comportamiento del mismo código en diferentes versiones de ubuntu está en las implementaciones del búfer de manejo del archivo del kernel de Linux.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda