2012-07-03 18 views
7

Esiste un modo per controllare i pool di thread che gestiscono le funzioni che vengono inviate agli agenti? Mentre capisco le cose, se mi mando, sotto il cofano sto usando un pool di thread illimitati. Vorrei, ad esempio, eseguire alcune funzioni su un pool di thread e altre funzioni su un altro. La ragione di ciò è che ho alcune funzioni che fanno IO e che sono anche meno importanti. Li avrei buttati su un pool di thread limitato e non mi preoccuperei se ci fosse un blocco eccessivo e si accumulassero poiché sono, beh, meno importanti. La cosa principale è che non vorrei che il loro crappy IO blocking abbia un effetto su alcune funzioni più importanti che sono in esecuzione su un altro pool di thread.Gestione pool di thread agente in Clojure

Sto basando la domanda su qualcosa di simile che ho fatto con i pool di thread in Akka e mi sto solo chiedendo di poter realizzare la stessa cosa con Clojure.

+0

Suggerirei di utilizzare l'IO asincrono per risolvere tale problema piuttosto che gestire un pool di thread per operazioni IO – Ankur

risposta

12

Per le versioni Clojure fino a 1.4:

Non è possibile sostituire il built-in agent inviare e send-off pool di thread. Sono hard-coded in Agent.java.

Il pool di invio (utilizzato per il calcolo) è fixed size = 2 + Runtime.getRuntime(). AvailableProcessors().

Il pool di invio (utilizzato anche per i futures) è un pool di thread memorizzato nella cache e crescerà senza vincoli. Ciò consente ad un numero arbitrario di attività in background di attendere I/O. I thread memorizzati nella cache saranno riutilizzati e scartati se sono rimasti inattivi per un minuto.

Se si desidera gestire il lavoro sul proprio pool di thread, è necessario immergersi in java.util.concurrent o utilizzare una lib di wrapper Clojure.

Per Clojure 1.5 (imminente):

È possibile fornire il proprio ExecutorService utilizzando (send-via esecutore a f), i threadpools di default non sono cablati più. Vedi Agent.java in Clojure 1.5+ per i dettagli.

+0

Un modo per fare la stessa definizione di ThreadPools personalizzato per Futures in 1.5+? –

+0

Re custom ThreadPools for Futures - no. –

1

Amit Rathore (di Runa inc), ha pubblicato una libreria (chiamata medusa) per la gestione dei pool di thread. Sembra una partita abbastanza vicina per quello che stai cercando.

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

+0

è integrato con gli agenti o è separato? in altre parole, puoi usarlo per sostituire i pool di thread integrati? o c'è un modo per creare agenti con un pool di thread diverso? non riesco a vedere nulla che spieghi questo ... quando ero preoccupato per questo ho chiesto questo q - http://stackoverflow.com/questions/10969708/parallel-doseq-for-clojure - e non credo che risposta ha fornito un modo semplice per sostituire la funzionalità del sistema. –

+0

medusa è una libreria alternativa per eseguire attività asincrone, è un'alternativa agli agenti integrati. –

2

La libreria Clojure Claypoole è progettata esattamente per questo. Ti consente di definire i threadpool e usarli (e riusarli) per futures, pmaps e così via.

+1

Correggetemi se ho torto, ma non penso che Claypool ti dia il controllo sui pool di thread dell'agent, solo i pool di thread usati per _it's_ custom 'future',' pmap' e così via per le implementazioni. – metasoarous

+0

Oh, sì, hai ragione. –