2011-07-09 7 views
5

Tengo algunos problemas con Node.js, y creo que el problema podría ser que estoy malinterpretando el enfoque de Node.js respecto a la concurrencia. Aquí hay un ejemplo simplificado del servidor que he escrito. La idea es que el servidor se utilice para pruebas automatizadas: mantiene una lista de las "configuraciones" esperadas y las compara con las "configuraciones" que envía el cliente.El rastreo de depuración de Node.js parece implicar varios hilos de ejecución: ¿cómo interpretar esto correctamente?


//expectedConfigurations gets initialized up here 

var server = http.createServer(function(request, response) { 
    switch (url.pathname) { 
     case "/check-configuration": 
      jsonData = ""; 
      request.on("data", function(data) { 
       return jsonData += data; 
      }); 

      request.on("end", function() { 
       var configuration, errMsg, expectedConfiguration; 

       console.log("finished reading json data", jsonData); 
       expectedConfiguration = expectedConfigurations.shift(); 
       console.log("Expected configuration", expectedConfiguration); 
       configuration = new Set(JSON.parse(jsonData)); 
       if (expectedConfiguration.equals(configuration)) { 
        response.writeHead(200, {"Content-Type": "text/plain"}); 
        response.write("Matched expected configuration."); 
        return response.end(); 
       } else { 
        response.writeHead(500, { 
         "Content-Type": "text/plain" 
         }); 
        errMsg = "Did not match expected configuration. Received: " + (JSON.stringify(configuration)) + ". Expected:" + (JSON.stringify(expectedConfiguration)) + "."; 
        response.write(errMsg); 
        response.end(); 
        console.error(errMsg); 
        results.testsFailed.push(currentTest); 
        return transitionToBeforeSendingTestState(); 
       } 

      }) 
    } 
}) 

Mi entendimiento es que Node.js es de un solo subproceso, lo que si bien puede generar múltiples tareas que pueden ser manejados de forma asíncrona, sólo un hilo de ejecución a la vez va a introducir el código JavaScript se ejecuta en Node.js . Por desgracia, la salida de depuración que estoy recibiendo de mi servidor parece desafiar esta suposición:


received request for /check-configuration 
finished reading json data [ "a" ] 
Expected configuration [ "a" ] 
received request for /check-configuration 
Did not match expected configuration. Received: [ "a" ]. Expected: [ "c" ]. 

leí esto como el siguiente:

  1. el servidor recibe una petición. Comienza a leer datos de solicitud de forma asincrónica.
  2. el servidor termina de leer datos de la solicitud, muta expectedConfigurations por el cambio, y asigna los resultados a expectedConfiguration [ 'a' ]
  3. el hilo y luego se interrumpe por una nueva solicitud al servidor! aquí es donde mis expectativas de la ejecución de un único subproceso de contenido de JavaScript en Node.js parecen romperse.
  4. Finalmente, se reanuda el hilo original de ejecución asociado con la primera solicitud. La configuración esperada se compara con la configuración real recibida, pero ahora, en lugar de tener el valor [ 'a' ], como lo hizo en el paso 2., tiene el valor ["c"].

Parece que debo interpretar esto incorrectamente, porque me impide entender el modelo de ejecución de un único subproceso de Node.js, pero ahora no puedo ver cómo se puede interpretar esto. Agradecería cualquier orientación que cualquiera pueda ofrecer sobre esto.

Respuesta

1

intente repetir la misma prueba utilizando console.error en lugar de console.log en todas partes. Por lo que yo sé, console.log no tiene bloqueos (los datos se almacenan temporalmente en el momento de la llamada y se escriben en stdout en algún momento posterior) y console.error está bloqueando.

Cuestiones relacionadas