2012-07-03 9 views
7

¿Hay alguna forma de controlar los grupos de subprocesos que manejan las funciones que se envían a los agentes? Como entiendo las cosas, si envío, debajo del capó estoy usando un grupo de hilos sin límites. Me gustaría, por ejemplo, ejecutar algunas funciones en un grupo de subprocesos y otras funciones en otro. La razón para esto es decir que tengo algunas funciones que hacen IO y que también son menos importantes. Me gustaría lanzar estos en un grupo de hilos delimitados y no me preocuparía si hubiera un bloqueo excesivo y se acumulan ya que son, bueno, menos importantes. Lo principal es que no me gustaría que su horrible bloqueo de IO dijera tener un efecto sobre algunas funciones más importantes que se ejecutan en otro grupo de subprocesos.Administrar grupos de subprocesos de agente en Clojure

Estoy basando la pregunta de algo similar que hice con grupos de subprocesos en Akka y me pregunto si puedo lograr lo mismo con Clojure.

+0

Sugeriría utilizar async IO para resolver ese problema en lugar de administrar un grupo de subprocesos para las operaciones de IO – Ankur

Respuesta

12

Para las versiones de Clojure hasta 1,4:

No se puede reemplazar la incorporada en el agente de enviar y de despedida grupos de subprocesos. Están codificados en Agent.java.

El grupo de envío (utilizado para el cálculo) es de tamaño fijo = 2 + Runtime.getRuntime(). AvailableProcessors().

El grupo de envío (también utilizado para futuros) es un grupo de subprocesos en caché y crecerá sin límite. Esto permite que una cantidad arbitraria de tareas en segundo plano espere a la E/S. Los subprocesos en caché se reutilizarán y descartan si han estado inactivos durante un minuto.

Si desea administrar el trabajo en su propio grupo de subprocesos, tendrá que sumergirse en java.util.concurrent o utilizar un lib de Clojure.

Para Clojure 1.5 (próxima):

Puede proporcionar su propia ExecutorService usando (enviar-a través de un ejecutor f), los threadpools por defecto no están cableados más. Ver Agent.java in Clojure 1.5+ para más detalles.

+0

¿Alguna manera de hacer la misma definición de ThreadPools personalizados para futuros en 1.5+? –

+0

Re ThreadPools personalizados para futuros - no. –

1

Amit Rathore (de Runa inc), ha publicado una biblioteca (llamada medusa) para gestionar grupos de hilos. Parece una coincidencia bastante cercana para lo que estás buscando.

http://s-expressions.com/2010/06/08/medusa-0-1-a-supervised-thread-pool-for-clojure-futures-2/

+0

¿está integrado con agentes, o está separado? en otras palabras, ¿puede usarlo para reemplazar los grupos de subprocesos incorporados? o hay alguna forma de crear agentes con un grupo de subprocesos diferente? No puedo ver nada que explique esto ... cuando estaba preocupado por esto, pregunté esto q - http://stackoverflow.com/questions/10969708/parallel-doseq-for-clojure - y no creo que ningún La respuesta proporcionó una manera perfecta de reemplazar la funcionalidad del sistema. –

+0

medusa es una biblioteca alternativa para ejecutar tareas asincrónicas, es una alternativa a los agentes integrados. –

2

La biblioteca de Clojure Claypoole está diseñada exactamente para esto. Le permite definir grupos de subprocesos y usarlos (y reutilizarlos) para futuros, pmaps, etc.

+1

Corrígeme si me equivoco, pero no creo que Claypool le dé control sobre los grupos de subprocesos de agente, solo los grupos de subprocesos utilizados para las implementaciones personalizadas 'future',' pmap' y demás. – metasoarous

+0

Oh, sí, tienes razón. –

Cuestiones relacionadas