La documentación sobre la función pmap
me hace preguntar qué tan eficiente que sería para ir a buscar algo así como una colección de fuentes XML a través de Internet. No tengo idea de cuántas operaciones de búsqueda concurrentes generaría pmap y cuál sería el máximo.¿Cuántos subprocesos genera la función pmap de Clojure para las operaciones de captación de URL?
Respuesta
Si marca la fuente que ver:
> (use 'clojure.repl)
> (source pmap)
(defn pmap
"Like map, except f is applied in parallel. Semi-lazy in that the
parallel computation stays ahead of the consumption, but doesn't
realize the entire result unless required. Only useful for
computationally intensive functions where the time of f dominates
the coordination overhead."
{:added "1.0"}
([f coll]
(let [n (+ 2 (.. Runtime getRuntime availableProcessors))
rets (map #(future (f %)) coll)
step (fn step [[x & xs :as vs] fs]
(lazy-seq
(if-let [s (seq fs)]
(cons (deref x) (step xs (rest s)))
(map deref vs))))]
(step rets (drop n rets))))
([f coll & colls]
(let [step (fn step [cs]
(lazy-seq
(let [ss (map seq cs)]
(when (every? identity ss)
(cons (map first ss) (step (map rest ss)))))))]
(pmap #(apply f %) (step (cons coll colls))))))
El (+ 2 (.. Runtime getRuntime availableProcessors))
es una gran pista allí. pmap tomará las primeras piezas de trabajo (+ 2 processors)
y las ejecutará de forma asíncrona a través del future
. Entonces, si tienes 2 núcleos, lanzará 4 piezas de trabajo a la vez, tratando de mantenerte un poco adelantado, pero el máximo debería ser 2 + n.
future
en última instancia, utiliza el agente de grupo de subprocesos de E/S que soporta un número ilimitado de hilos. Crecerá a medida que se lanza trabajo y se reducirá si los hilos no se usan.
Sobre la base de una excelente respuesta de Alex que explica cómo funciona la PMAP, aquí está mi sugerencia para su situación:
(doall
(map
#(future (my-web-fetch-function %))
list-of-xml-feeds-to-fetch))
Justificación:
- que desea como muchas piezas de trabajo durante el vuelo como puedas , ya que la mayoría se bloqueará en la red IO.
- futura disparar una pieza asíncrono de trabajo para cada solicitud, que deberá tratarse en un grupo de subprocesos. Puedes dejar que Clojure se encargue de eso inteligentemente.
- El Doall en el mapa obligará a la evaluación de la secuencia completa (es decir, el lanzamiento de todas las solicitudes).
- Su hilo principal puede iniciar la eliminación de referencias a los futuros de inmediato, y por lo tanto puede seguir avanzando ya que los resultados individuales regresan
No hay tiempo para escribir una larga respuesta, pero hay una clojure.contrib http-agente que crea cada solicitud get/post como su propio agente. Así que puedes disparar miles de solicitudes y todas se ejecutarán en paralelo y se completarán a medida que aparezcan los resultados.
Mirando el funcionamiento de pmap, parece ir 32 hilos a la vez sin importar la cantidad de procesadores que tener, el problema es que el mapa se adelantará al cálculo por 32 y los futuros se inician por sí mismos. (Muestra) (defn samplef [n] (println "starting " n) (Thread/sleep 10000) n) (def result (pmap samplef (range 0 100)))
; esperará 10 segundos y verá 32 copias, luego cuando tome la 33 y otra 32 ; imprime este minuto que está haciendo 32 hilos simultáneos a la vez ; para mí esto no es perfecto ; SALUDOS Felipe
- 1. ¿Hay alguna manera de controlar la cantidad de subprocesos usados con pmap?
- 2. clojure pmap/preduce vs fork-join
- 3. cambio de interacción vinculante y pmap?
- 4. multithreading (openMP): cuántos subprocesos paralelos
- 5. Limpiar la función Clojure
- 6. ¿Cuántos subprocesos puedo ejecutar al mismo tiempo?
- 7. Las condiciones de carrera y átomos clojure
- 8. ¿Por qué la captación lenta de WADL?
- 9. VB.NET Dos enfoques diferentes para las operaciones genéricas de subprocesos cruzados; ¿cual es mejor?
- 10. SQL de las operaciones
- 11. Spring-WS genera WSDL sin operaciones
- 12. ¿Cuántos parámetros de función son demasiados?
- 13. Clojure sintaxis argumento de la función
- 14. DSL para la síntesis de imágenes Clojure
- 15. clojure ejecución de la función diferida
- 16. Administrar grupos de subprocesos de agente en Clojure
- 17. ¿Cómo usar la función doc de clojure?
- 18. edificio Clojure de URL de partes constituyentes
- 19. Seguridad de subprocesos de std :: map para operaciones de solo lectura
- 20. ¿Orden de las operaciones para preincremento y postincremento en un argumento de función?
- 21. ¿Las variables estáticas de la función son seguras para subprocesos en GCC?
- 22. ¿Cuántos argumentos toma la función foldr de Haskell?
- 23. Idiomatic Clojure forma de generar y gestionar subprocesos de fondo
- 24. ¿Cuántos subprocesos simultáneos en una aplicación son muchos?
- 25. ¿Cuántos subprocesos/usuarios puede simular un cliente de Windows durante mi prueba de carga?
- 26. Comprensión de loff_t * offp para las operaciones de archivo
- 27. captación devuelve NULL
- 28. obtener un código de función de clojure
- 29. conjunto de operaciones contra las operaciones de la matriz en rubí
- 30. R: acelerar las operaciones de "agrupar por"
Así es la respuesta corta que 'pmap' está perfectamente bien para el envío de una gran cantidad de llamadas web y procesar las respuestas? ¿Hay alguna advertencia? – dan
Puedo estar equivocado, pero el problema probablemente sea que los n + 2 hilos bloquearán la espera de las respuestas web. Por lo tanto, no obtendrá suficientes solicitudes de vuelo para obtener el máximo rendimiento: pmap está diseñado para cargas de trabajo vinculadas a la CPU. Si esto le sucede a usted, entonces puede simplemente ajustar cada llamada de solicitud en un futuro y todos volarán a la vez. – mikera
Bueno, nunca hay una respuesta corta con concurrencia. :) Diría que pmap en realidad no es ideal para este caso de uso. Realmente desea esperar * todas * las fuentes en paralelo - pmap retrasará el inicio de la quinta en el caso anterior.A MENOS QUE, no necesariamente quiera pasar por todas sus fuentes, en cuyo caso el comportamiento perezoso de pmap es bueno. Me sentiría tentado de que tus cosas se localicen en las fuentes y utilicen el futuro para realizar cada solicitud. –