javascript - loop - node js temporizador
Confusión sobre el mecanismo de E/S asÃncrono interno de node.js (2)
En primer lugar,
libuv
ha eliminado ellibeio
de él. Pero sí realiza la E / S de archivos asíncronos con un grupo de subprocesos comolibeio
tal como mencionó.libuv
también eliminalibev
. Realiza la E / S de red asíncrona basada en las interfaces de E / S asíncronas en diferentes plataformas, comoepoll
,kqueue
eIOCP
, sin un grupo de subprocesos. Hay un bucle de eventos que se ejecuta en el hilo principal deuv
que sondea los eventos de E / S y los procesa.El grupo de subprocesos dentro de
libuv
es un grupo de subprocesos de tamaño fijo ( 4 en uinx como sistema ). Realiza una función de cola de tareas y evita el agotamiento de los recursos del sistema al generar subprocesos indefinidamente cuando aumentan las solicitudes.
- He aprendido que node.js usa libeio internamente para realizar E / S asíncrona de archivos , con grupo de subprocesos, en la plataforma * nix, ¿verdad?
- ¿Qué pasa con la red I / O asíncrona? ¿Es hecho por libev? ¿Hay también un grupo de hilos?
- Si hay un grupo de subprocesos dentro, ¿cómo podría ser más eficiente que el modelo tradicional de un subproceso por solicitud? ¿Y es un hilo por solicitud de E / S?
- ¿Y cuál es el mecanismo en las ventanas? Sé que lo ha hecho IOCP, y hay un grupo de subprocesos a nivel del kernel, ¿verdad?
- ¿Por qué Linux todavía no tiene un mecanismo AIO completamente nativo como Windows IOCP? ¿Tendrá en el futuro?
Actualización de acuerdo a la respuesta de changchang:
- Tomé una vista rápida del código fuente que @changchang le di, encontré que el tamaño de grupo de subprocesos predeterminado se puede restablecer mediante UV_THREADPOOL_SIZE . Me pregunto en qué caso se usará esto.
- También encontré que getaddrinfo usa este grupo de subprocesos, ¿hay algo más excepto fs? Y si todos los trabajos de sincronización se realizarán en este grupo de subprocesos, ¿es el tamaño predeterminado ''4'' suficiente?
- Como entiendo ahora, habrá 6 subprocesos básicos en el proceso node.js: 1 subproceso V8 (bucle de eventos, donde se ejecutan los códigos javascript del usuario), 1 bucle de eventos libuv y 4 en el grupo de subprocesos, ¿verdad?
¿Y cómo puedo ver estos hilos en mi shell (Ubuntu)? Yo uso ps -eLf | nodo grep | grep -v grep solo vio dos:
raíz 16148 7492 16148 0 2 20:43 pts / 26 00:00:00 ./bin/node /home/aaron/workspace/test.js
raíz 16148 7492 16149 0 2 20:43 pts / 26 00:00:00 ./bin/node /home/aaron/workspace/test.js
El nodo de la versión 0.6 de Uptil usó libev
para ejecutar el bucle de libeio
y libeio
para la E / S asíncrona (el back-end de Unix se encuentra en gran medida en estas dos bibliotecas). Pero libuv
ha comenzado a reemplazar libeio
y libeio
en la versión 0.8 . Realiza, mantiene y gestiona todos los eventos y eventos en el grupo de eventos. libuv
es la opción en bibliotecas de E / S asíncronas multiplataforma.
- Sí, hasta el nodo 0.6, obsoleto en 0.8 y utiliza el conjunto de subprocesos
Sí, pero
libev
no utiliza grupo de subprocesos. Ver hereAclaración: De acuerdo con el link en la question que
libeio
,libeio
admite todas las funciones POSIX relacionadas con la E / S (que incluye socket). Pero el autor del nodo decidió usarlo solo para la E / S de archivos asíncronos, y usalibev
para la E / S de la red. No sé de dónde lo escuchaste, pero puedes usar epoll en archivos normales.libev
utiliza el bucle de eventos, así que no hay problemas aquí.- Sí, IOCP maneja la E / S asíncrona en Windows, el kernel usa grupos de subprocesos.
- El nuevo kernel de Linux tiene epoll, kqueue en el nuevo kernel BSD.
libeio
ylibeio
eran para el entorno de Linux y proporcionan un bucle / asíncrono de eventos IO para todo el kernel (admite select, poll, epoll, kqueue).
Preguntas de actualización:
- no se mucho sobre
libuv
- tal vez suficiente (no sé)
Aquí están mis hallazgos en Windows 8, lo verifiqué a través de Process Explorer. Mostró 4 hilos, 1 DLL, 1 archivo y 1 sección (un total de 7 entradas) para un proceso de aplicación de nodo.
ps -eLf
muestra todos los subprocesos y procesos, quizás esté sobre-filtrando, solo busque el nodo de proceso pid comops -eLf | grep x
ps -eLf | grep x
donde x es pid para el proceso de nodo.