Hi Clojure 团队,
在 Liftoff,我们是 Clojure 的大用户(250 多个项目,约 40 万行代码)。我们已经构建了一些工具,可以自动根据项目代码的静态分析生成 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 工具的未来版本中改变这种行为?
谢谢!