concurrency - 太多的 future

标签 concurrency clojure

我有一个函数,它需要 2 个函数,一个函数监视某个事件,另一个函数实际执行工作,每个函数都在 future 运行,一旦事件 future 返回失败,调用者线程就会通知 worker future 停止。如果工作线程在接收到事件之前完成调用者线程然后通知观察者停止然后调用者返回。

这工作正常,但问题是执行实际工作的工作函数可能/确实需要检查其他事件,每次我需要注意某个事件时,我都会触发 2 个额外的 future 。问题是,最大 future 运行的数量有限制吗?我有时可能会得到 60 个 future ?线程池会根据需要增长吗?并且由于它们在线程池上运行,因此我假设它们的创建成本不会太高?

最佳答案

这一切都取决于 Executor .假设您创建了一个 ExecutorExecutors.newFixedThreadPool(n)并提交n * 100个任务给它,不会有超过n个线程正在运行 .

如果您使用的是 Clojure 的 future function它会将您的任务提交至 clojure.lang.Agent.soloExecutor . soloExecutor 是用 Executors.newCachedThreadPool(threadFactory) 创建的,因此它将重用线程并尽可能多地运行。

关于concurrency - 太多的 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310171/

相关文章:

ios - NSFetchedResultsControllerDelegate在合并来自另一个上下文的更改后更新表单元格

java - Spring:单例/ session 范围和并发

java - 使用 spring 入站文件适配器进行并发处理

groovy - 从放置在 war 中的 groovy jar 运行 Groovy CLI

clojure - 带有 compojure 的 hiccup 表单助手

clojure - 为什么我不能在 js->clj 生成的序列中调用 seq 函数?

java - 寻找合适的同步机制

java - Java 会自动异步调用这些方法吗?

clojure - 'do' 特殊形式有什么作用?

clojure - Ring 和 Compojure - 内容类型为 application/json 的 POST 请求不起作用