2012-01-01 9 views
14

¿Qué causaría que un programa Clojure no salga inmediatamente después de finalizar la última instrucción en la función principal?¿El programa Clojure no sale cuando finaliza la última declaración?

Todo lo que hice fue cambiar un (doall (map ...)) a un (doall (pmap ...)), y de repente el programa se bloqueó al completar sus tareas durante un buen número de segundos antes de salir. Pondría un (println "Finished everything!") en la última línea de la función -main, e imprimiría eso, pero aún no saldrá por un tiempo. ¿Qué podría causar este comportamiento y cómo debería solucionarlo?

EDITAR: El pmap es la única parte del programa que está paralelizada (principalmente porque todo lo demás se ejecuta más o menos al instante). Como las últimas partes del programa requieren todos los resultados de pmap para funcionar correctamente, y como la salida del programa es la misma tanto para map como para pmap, dudo que pmap todavía se esté ejecutando al final del programa. Poner (System/exit 0) al final en lugar de println tampoco cambia la salida del programa.

+1

supongo que pmap no debe hacerse por completo haciendo su procesamiento cuando el código después de que se dispara. Difícil de decir sin más código mostrado. –

+1

posible duplicado de [¿Por qué cuelga Clojure después de haber realizado mis cálculos?] (Http://stackoverflow.com/questions/2622750/why-does-clojure-hang-after-having-performed-my-calculations) – amalloy

Respuesta

15

pmap girará varios subprocesos de un subproceso de subprocesos para dar servicio a sus tareas concurrentes.

Llamar a los agentes de apagado es necesario para permitir que la JVM salga de forma ordenada porque los hilos en los grupos de hilos del agente no son hilos de daemon.

Necesita decirles explícitamente que cierren correctamente (pero solo cuando su programa esté hecho). Esto parece haber sido respondido antes de here.

Citando de esa respuesta:

"Es necesario llamar shutdown-agents para matar los hilos que respaldan la threadpool utilizado por pmap"

Docs están aquí: http://clojuredocs.org/clojure_core/1.3.0/clojure.core/shutdown-agents

+0

¡Gran solución! Me he encontrado con este problema en varios proyectos donde pague para ejecutar otros comandos, y agregar '(shutdown-agents)' lo corrige. Presumiblemente, 'clojure.java.shell' está utilizando algún tipo de otro hilo para hacer su trabajo. –

4

Según la docs:

... [pmap es O] ólo útil para funciones computacionalmente intensivos donde el tiempo de f domina la sobrecarga coordinación.

Así que esto probablemente significa que hay más sobrecarga usando pmap para su escenario de utilizar map. Las operaciones de pmap probablemente tarden un poco más en terminar antes del código después de los incendios pmap.

+0

I don No me importa que me voten a la baja, pero por favor al menos den una explicación. –

+0

Gracias por la respuesta Jason, pero dudo que pmap no haya terminado sus operaciones por las razones que agregué a la pregunta. ¿Tendría alguna otra idea sobre este comportamiento? Además, solo fyi, no te menosprecié. – wrongusername

+0

@wrongusername: No hay otras sugerencias. Y no es necesario por su aspecto, gracias a la respuesta proporcionada por Scott Lowe. –

Cuestiones relacionadas