Hi Clojure 团队,
在 Liftoff,我们是 Clojure 的大用户(超过400k LOC,涵盖250+个项目)。我们构建了一些工具,可以自动为项目生成基于代码静态分析的 deps.edn 文件。
我们的某些工具和测试代码反复调用 clojure.tools.deps.alpha/resolve-deps。从版本 v0.14.1178 开始,我们注意到以下情况
- resolve-deps 在每次调用时都会创建一个新的 java.util.concurrent.ExecutorService,但在返回之前并未关闭它(代码)。这导致我们的测试代码创建了20k+个线程。
- clojure.tools.deps.alpha.util.concurrent/submit-task 将线程绑定推入一个固定大小的线程池,但不将它们弹出(代码)。由于线程被重复使用,调用栈持续增长。
我们内部现在使用了一个修改过的工具版本,该版本在每次调用 resolve-deps 时无条件关闭 ExecutorService,并为每个任务弹出线程绑定。这解决了我们的问题,但我们不知道这是否是正确的解决方案。
Clojure 核心团队如何看待 CLI 工具中的并发?我们是否可以期待 CLI 工具的未来版本会改变这种行为吗?
谢谢!