7

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

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

4

3 回答 3

14

对于最高 1.4 的 Clojure 版本:

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

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

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

如果您想在自己的线程池上管理工作,则需要使用 java.util.concurrent 或使用 Clojure 包装器库。

对于 Clojure 1.5(即将推出):

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

于 2012-07-04T05:00:16.557 回答
2

Clojure 库Claypoole正是为此而设计的。它允许您定义线程池并将它们用于(和重用)期货、pmap 等。

于 2014-07-25T17:50:04.387 回答
1

Amit Rathore(来自 Runa 公司)发布了一个用于管理线程池的库(称为 medusa)。它看起来与您正在寻找的内容相当接近。

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

于 2012-07-03T20:55:37.083 回答