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