Estoy usando this approach para almacenar datos en una matriz global que aloja un servidor http donde ciertas solicitudes manipularán la matriz global.¿Qué operaciones en el nodo son seguras para hilos?
Estoy un poco preocupado por problemas de enhebrado con ciertas operaciones, principalmente push
y splice
. Me imagino que si una solicitud me obliga a iterar sobre la matriz y eliminar elementos en función de un condicional, mientras que otra solicitud me llama al .push()
en la matriz en la que me toparé con problemas. ¿Alguien puede confirmar esto?
Principalmente escribo en C# donde incluso un simple incremento no es seguro para subprocesos (al iniciar 25 hilos que hacen i ++, no garantizaré que i == 25 después de todo dicho y hecho).
actualización:
He escrito 5 ejemplos para demostrar lo que estoy hablando. Prueba 1 y Prueba 3 funcionan bien. La prueba 2 falla, debido a ... lo que normalmente se llamaría problemas de subprocesamiento (ya sean hilos de CPU reales o no). 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).
estoy usando ApacheBench para poner a prueba, por lo que 1000 solicitudes paralelas.
Esto me lleva a pensar que la Prueba 1 y Prueba 3 trabajos bien porque nodejs no se ejecutarán más de 1
instancia de la
función javascript en paralelo (bloqueo?). Tan pronto como implemente setInterval/setTimeout, liberará nodejs para ejecutar otra instancia de la devolución de llamada (¿no bloqueo?).app.get('/test3'...)
de devolución de llamada en paralelo
Estoy tratando de entender qué diablos realmente significa non-blocking I/O model
. ¿Significa que "hey es posible hacer no-bloqueo con setTimeout y setInterval si necesita no-bloqueo, de lo contrario vamos a bloquear cualquier otra función de nivel externo para que se ejecute hasta que agotemos la función en la que estamos" ? Siento que es imprescindible saber esto para no tener problemas pensando que podría implementar algo como/test2 y estar totalmente seguro.
Además, si intento no bloquear con mis devoluciones de llamada, ¿realmente debería llamar al setTimeout(code, 1)
? ¿O hay un mejor camino?
Entonces, cuando nodeJs/V8 entra en una función() {} que escribí, no se ejecutarán otras funciones mías, excepto las llamadas internas (como devoluciones de llamada)? – Langdon
Por cierto, JavaScript puede ser de un solo subproceso, pero nodeJS parece ser de subprocesos múltiples, de lo contrario, las solicitudes posteriores al servidor http incorporado no podrían volver hasta que termine el primero. Además, http://stackoverflow.com/questions/7018093/nodejs-really-single-threaded – Langdon
@ Langdon, ya sea que tenga varios hilos o no, es un detalle de implementación que no debería preocuparle. Todo lo que hace es IO asíncrono, ya sea directamente en el nivel del kernel o IO asíncrono emulado utilizando grupos de hilos – Raynos