Clojure 2024调查问卷中分享您的想法!

欢迎!请参阅关于页面,了解更多有关如何使用本网站的信息。

+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 -- 这是为了避免程序在结束时挂起而添加的友好功能。

这种行为变化的原因可能是因为想要能够连用函数 -- 因此,exec函数本身不能调用 shutdown-agentsSystem/exit,因为这样做会“断链”,所以只有CLI可以在所有exec函数“完成”后调用这些函数。

在调用 -X 之后期望干净的shell退出和希望后台线程保持活动状态(如Socket服务器示例)之间存在固有的矛盾。

by
Sean的分析大体正确。这并不真的是关于连用的问题,因为连用功能尚未出现,而只是希望在执行-X函数时能够符合期望的关闭方式。这里有多 种情况

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

我认为没有一种行为能默认适用于所有情况(你总是可以包装一个函数并做一些正确的事情)。

已记录为https://clojure.atlassian.net/browse/TDEPS-198
by
我们在工作中通过包装商品到另一个exec函数来部分解决这个问题,但这很繁琐,并且不具备通用性,所以我很高兴看到这个问题在1.10.3.933中得到了解决 -- 谢谢!
...