在Clojure中管理代理线程池

pon*_*tic 7 clojure

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

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

Ale*_*ler 12

对于高达1.4的Clojure版本:

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

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

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

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

对于Clojure 1.5(即将发布):

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