34 votos

Son grupos de subprocesos necesarios para el puro código Haskell?

En el Mundo Real Haskell, Capítulo 28, Software transaccional de la memoria, un concurrente web link checker es desarrollado. Recupera todos los enlaces en una página web y aciertos de cada una de ellas con una HEAD de solicitud de averiguar si el enlace está activo. Un concurrente enfoque que se adopte para la construcción de este programa y se realiza la siguiente instrucción:

No podemos simplemente crear un thread por URL, ya que pueden sobrecargar nuestro CPU o nuestra conexión de red si, como esperamos) la mayoría de los enlaces son en vivo y sensible. En su lugar, utilizamos un número fijo de subprocesos de trabajo, que captura las direcciones Url para descargar de una cola.

Yo no entiendo por qué este grupo de subprocesos que se necesita en lugar de utilizar forkIO para cada enlace. AFAIK, la Haskell tiempo de ejecución mantiene un grupo de hilos y horarios de manera adecuada de modo que no veo la CPU está sobrecargado. Además, en una discusión acerca de la simultaneidad en el Haskell lista de correo, me encontré con la siguiente declaración que va en la misma dirección:

El paradigma que no tiene ningún sentido en Haskell es subprocesos de trabajo (desde la estrategia en tiempo real hace que para nosotros); en lugar de ir a buscar a un trabajador, sólo forkIO lugar.

Es el conjunto de hilos sólo se requiere para la parte de red o hay una CPU razón para ello?

23voto

sclv Puntos 25335

El meollo de la cuestión, me imagino, es el lado de la red. Si usted tiene 10.000 enlaces y forkIO para cada enlace, entonces usted potencialmente tiene 10.000 sockets estás tratando de abrir de una vez, que, dependiendo de cómo su sistema operativo está configurado, probablemente incluso no ser posible, mucho menos eficiente.

Sin embargo, el hecho de que tenemos hilos verdes que son "virtualmente", programado a través de múltiples os hilos (que idealmente se pegó a núcleos individuales) no significa que se puedan distribuir el trabajo de forma aleatoria sin que se refiere al uso de cpu. La cuestión aquí no es tanto que la programación de la CPU sí no será manejado por nosotros, sino que el contexto cambia (incluso verdes) costo de los ciclos. Cada hilo, si su trabajo en diferentes tipos de datos, será necesario extraer los datos en la cpu. Si no hay suficientes datos, que significa tirando cosas dentro y fuera de la caché de cpu. Aún en ausencia de eso, significa tirar las cosas de la caché a los registros, etc.

Incluso si un problema es trivialmente paralelo, es prácticamente nunca la idea de derecho que acaba de romper tan pequeño como sea posible y tratar de hacer todo a la vez".

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X