Clojure中管理代理线程池

7
有没有一种方法可以控制处理发送到代理的函数的线程池?据我所知,如果我使用send-off,在底层使用的是一个无限制的线程池。我想要在一个线程池上运行一些函数,而在另一个线程池上运行其他函数。原因是假设我有一些执行IO的函数,它们也不太重要。我会将它们放在一个有界线程池中,并且不会担心由于它们较不重要而出现过多阻塞和堆积。最重要的是,我不希望它们糟糕的IO阻塞对其他正在另一个线程池上运行的更重要的函数产生影响。

我基于在Akka中使用线程池的类似情况提出了这个问题,我只是想知道我是否可以通过Clojure实现同样的事情。


我建议使用异步IO来解决这个问题,而不是管理一个线程池进行IO操作。 - Ankur
3个回答

14

对于 Clojure 1.4 及更早版本:

你不能替换内置的 agent send 和 send-off 线程池。它们在 Agent.java 中被硬编码。

send 线程池(用于计算)的固定大小为 2 + Runtime.getRuntime().availableProcessors()。

send-off 线程池(也用于 future)是一个缓存的线程池,会无限制地增长。这允许任意数量的后台任务等待 I/O。缓存线程将在一分钟内空闲时被重复使用和丢弃。

如果你想要在自己的线程池中管理工作,你需要深入使用 java.util.concurrent 或使用一个 Clojure 包装库。

对于 Clojure 1.5(即将发布):

你可以使用 (send-via executor a f) 提供自己的 ExecutorService,不再有默认的线程池硬编码。详见 Clojure 1.5+ 中的 Agent.java


有没有办法在1.5+中为Futures定义自定义ThreadPools? - Didier A.
根据答案中的信息(在此阅读时),@DidierA。看起来future使用与send-off相同的Executor,因此我认为我们可以通过set-agent-send-off-executor!设置future使用的执行器。 - Avi Flax

2

针对此类问题,Clojure 库 Claypoole 可以提供帮助。该库允许您定义线程池,并在 futures、pmaps 等方面使用(和重复使用)它们。


1
请纠正我,但我认为Claypool不会让你控制代理线程池,只能控制用于其自定义的“future”,“pmap”等实现的线程池。 - metasoarous

1

它是否与代理集成,还是独立的?换句话说,您可以使用它来替换内置线程池吗?还是有一种方法可以创建具有不同线程池的代理?我找不到任何解释这个问题的东西...当我担心这个问题时,我问了这个问题-https://dev59.com/AGgu5IYBdhLWcg3w8Lav我认为没有任何答案提供无缝替换系统功能的方法。 - andrew cooke
Medusa是用于运行异步任务的另一种库,它是内置代理的替代品。 - Arthur Ulfeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接