2024 年 Clojure 状态调查! 分享您的想法。

欢迎!请参阅 关于 页面了解更多关于此内容的工作方式。

+3
工具
已关闭

似乎与 Clojure CLI 1.10.3.929 中的 -X 和 futures 相关存在一个奇怪的问题

$ clojure --version
Clojure CLI version 1.10.3.929
$ clojure -Srepro -X clojure.core.server/start-server :name '"server"' :port 5555 :accept clojure.core.server/repl :server-daemon false
$ clojure -Srepro -J-Dclojure.server.repl="{:port 6666 :accept clojure.core.server/repl}"
$ nc localhost 5555
user=> (def x (future 1))
Execution error (RejectedExecutionException) at java.util.concurrent.ThreadPoolExecutor$AbortPolicy/rejectedExecution (ThreadPoolExecutor.java:2057).
Task java.util.concurrent.FutureTask@14c75e2b[Not completed, task = clojure.core$binding_conveyor_fn$fn__5772@4f4cba65] rejected from java.util.concurrent.ThreadPoolExecutor@5d5b17a8[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 1]
$ nc localhost 6666
user=> (def x (future 2))
#'user/x

我无法在 1.10.3.875 中重现此问题。

在 1.10.3.882 中,-X 调用根本不工作,因此我无法进一步缩小范围(容易地)。

已关闭并带注释: 在 Clojure CLI 1.10.3.933 中修复

1 答案

+1

已选中
 
最佳答案

我认为在 882 中,-X 调用 System/exit,这就是为什么那个版本不工作。

905 行为相同(退出)。

从912版本开始出现“不良”行为,我相当确信这是因为它们调用了shutdown-agents(这是一个为了支持其他会卡在结尾的程序执行函数而添加的功能)。

这种行为变化的原因可能在于希望通过简单串联多个函数,因此执行函数自身不能调用shutdown-agentsSystem/exit,因为这会“断开链”,所以只有在所有执行函数“完成”后,命令行接口(CLI)才能调用这些函数。

在调用-X后希望得到清爽的shell退出和希望后台线程保持存活(例如Socket服务器示例)之间存在紧张关系。

by
Sean的分析大致正确。这并不真的与串联功能有关,因为这个功能还没有实现,而是在执行-X功能时希望匹配预期的关闭方式。这里有几个情况:

* 使用future/agent,没有后台线程,期望完全退出。将等待1分钟以使后台代理池关闭,所以必须有shutdown-agents或System/exit。
* 有后台线程(如socket服务器)。期望被阻塞而不退出。不能使用System/exit(否则将杀死服务器)。
* 使用future/agent,并有后台线程(这种情况下)。期望阻塞而不退出。不能使用System/exit(会杀死服务器)或shutdown-agents(会杀死从服务器运行的未来/代理)。

我认为没有一种行为适用于所有情况(你总是可以包在函数中并执行你知道是正确的操作)。

记录为https://clojure.atlassian.net/browse/TDEPS-198
by
我们在工作中通过用另一个执行函数包裹东西来解决部分问题,但这相当费力且不够通用。因此,很高兴看到1.10.3.933中解决了这个问题——谢谢!
...