有没有办法控制处理发送给代理的函数的线程池?据我所知,如果我发送,在引擎盖下,我正在使用一个无界线程池。我想说,在一个线程池上运行一些函数,在另一个线程池上运行其他函数。这样做的原因是我有一些功能可以做IO而且也不太重要。我会把这些放在一些有限的线程池中,如果有过多的阻塞就不会担心它们会堆积起来,因为它们不太重要。最重要的是,我不希望他们糟糕的IO阻塞对一些在另一个线程池上运行的更重要的函数产生影响。
我的问题基于我在Akka中使用线程池所做的类似的事情,我只是想知道我可以用Clojure完成同样的事情。
答案 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/