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

欢迎!请参阅关于页面了解有关此信息。

0
序列
已关闭

你好
我有一个使用 Clojure 1.11 编写的服务,该服务在 Jetty 12 上运行。
我尝试使用 Java 21 和 Jetty 在虚拟线程上运行该服务。
以下约束条件阻止虚拟线程卸载

虚拟线程在以下情况下无法卸载:
当它被锁定到其载体时
以下是虚拟线程被锁定的情况
- 虚拟线程在同步块或方法中运行代码
- 虚拟线程运行本地方法或外部函数(参见外部函数和内存API)

我使用 '-Djdk.tracePinnedThreads=full' 键运行服务并发现 LazySeq
同步 LazySeq 方法会锁定虚拟线程

clojure.lang.LazySeq.sval(LazySeq.java:42) <== monitors:1
clojure.lang.LazySeq.seq(LazySeq.java:51) <== monitors:1

(顺便说一句,同步 Delay deref 方法也存在同样的问题)

在我看来,Clojure 标准库的实现和 Clojure 内部本身大量使用了 'synchronized' 方法,这与虚拟线程的约束条件不兼容。
我理解有大量代码,将其适应为与虚拟线程兼容需要巨大的努力和成本,但可能有一些关于与虚拟线程约束条件兼容的计划。

谢谢!

被关闭为一个重复问题:请求查找并消除虚拟线程锁定
嗨Andray,单独使用 synchronized 本身并不坏,只有当 synchronized 被用于阻塞操作时,才会成为问题,所以非常想了解你在这种情况下 lazy seq 中做了什么 -你是不是在外部 I/O(从流/读取器读取)或其他地方阻塞?如果你能在原始线程中添加更多细节,这将帮助我们考虑替代方案时将信息集中在一个地方。
感谢您的关注,Alex!
我想我的无聊场景只会给已经变得清晰的“请求查找并消除虚拟线程固定”问题增加噪音
- clojure.core/map 中调用的函数的阻塞 IO 调用
- clojure.core/deref 的阻塞 IO 调用

谢谢!
...