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工具的未来版本中发生变化?
谢谢!