在Clojure中管理代理线程池

时间:2012-07-03 18:13:16

标签: clojure

有没有办法控制处理发送给代理的函数的线程池?据我所知,如果我发送,在引擎盖下,我正在使用一个无界线程池。我想说,在一个线程池上运行一些函数,在另一个线程池上运行其他函数。这样做的原因是我有一些功能可以做IO而且也不太重要。我会把这些放在一些有限的线程池中,如果有过多的阻塞就不会担心它们会堆积起来,因为它们不太重要。最重要的是,我不希望他们糟糕的IO阻塞对一些在另一个线程池上运行的更重要的函数产生影响。

我的问题基于我在Akka中使用线程池所做的类似的事情,我只是想知道我可以用Clojure完成同样的事情。

3 个答案:

答案 0 :(得分:12)

对于高达1.4的Clojure版本:

您无法替换内置代理发送和发送线程池。它们在Agent.java中进行了硬编码。

发送池(用于计算)是固定大小= 2 + Runtime.getRuntime()。availableProcessors()。

send-off池(也用于期货)是一个缓存的线程池,无限制地增长。这允许任意数量的后台任务等待I / O.如果缓存的线程空闲一分钟,它们将被重用并被丢弃。

如果你想管理你自己的线程池上的工作,你需要深入了解java.util.concurrent或使用Clojure包装器。

对于Clojure 1.5(即将发布):

您可以使用(send-via executor a f)提供自己的ExecutorService,默认的线程池不再是硬连线。有关详细信息,请参阅Agent.java in Clojure 1.5+

答案 1 :(得分:2)

Clojure库Claypoole就是为此而设计的。它允许您定义线程池并使用(并重用)它们用于future,pmaps等。

答案 2 :(得分:1)

Amit Rathore(Runa inc)已经发布了一个用于管理线程池的库(称为medusa)。它看起来与你正在寻找的东西非常接近。

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