¿Qué operaciones en el nodo son seguras para subprocesos?

Estoy usandoEste enfoque para almacenar datos en una matriz global que alberga un servidor http donde ciertas solicitudes manipularán la matriz global.

Estoy un poco preocupado por tener problemas de subprocesos en ciertas operaciones, principalmentepush ysplice. Me imagino que si una solicitud me hace iterar sobre la matriz y eliminar elementos según un condicional, mientras que otra solicitud me hace llamar.push() en la matriz que voy a tener problemas. ¿Alguien puede confirmar esto?

Principalmente escribo en C # donde incluso un incremento simple no es seguro para subprocesos (el lanzamiento de 25 subprocesos que hacen i ++, no garantiza que i == 25 después de todo se haya dicho y hecho).

Actualizar:

He escrito 5 ejemplos para demostrar lo que estoy hablando. Prueba 1 y Prueba 3 funcionan bien. La prueba 2 falla, debido a que ... lo que normalmente se denominaría problemas de subprocesos (sean o no subprocesos reales de la CPU). Las pruebas 4 y 5, cuando se ejecutan en paralelo, parecen funcionar (lo que significa que no tienen problemas de colisión, como la prueba 2).

http://pastebin.com/HcJHTDFY

Estoy usando ApacheBench para probar, haciendo 1000 solicitudes paralelas.

Esto me lleva a creer que la Prueba 1 y la Prueba 3 funcionan bien porque los nodejs no ejecutarán más de 1instancia de laapp.get('/test3'...) devolución de llamada en paralelo Función javascript en paralelo (¿Bloqueo?). Tan pronto como implementas un setInterval / setTimeout, libera a los nodejs para ejecutar otra instancia de la devolución de llamada (¿sin bloqueo?).

Realmente estoy tratando de entender qué diablosnon-blocking I/O model realmente significa. ¿Significa que "hey es posible hacer el no bloqueo con setTimeout y setInterval si necesita el no bloqueo, de lo contrario, vamos a bloquear cualquier otra función de nivel externo para que no se ejecute hasta que agotemos la función en la que estamos" ? Siento que es imperativo saber esto para no meterme en problemas pensando que podría implementar algo como / test2 y estar totalmente a salvo.

Además, si estoy intentando no ser bloqueado con mis devoluciones de llamada, ¿realmente debería estar llamando?setTimeout(code, 1)? ¿O hay un mejor camino?

Respuestas a la pregunta(2)

Su respuesta a la pregunta