我试图了解 Clojure 的 go-blocks 与 Go 的 goroutines 的实现特征和由此产生的性能。
在 Clojure 中 >!!
和 <!!
阻塞当前线程,这意味着它们只能在显式创建线程时使用(否则“唯一的”主线程被阻塞)。 >!
和 <!
正在 parking ,因为 go
宏管理一个兼顾多个“进程”的隐式状态机。
然而,在 Go 中,这一切都隐藏在运行时中,goroutines 扮演着这两个角色。
那么说 Clojure 代码在仅使用 parking 版本时等同于 Go 是否正确?由于 go
中有一个线程池宏,这有点像 Go 的线程池底层 goroutines。除了性能会更差,因为 Go 在运行时执行此操作,而 Clojure 在 Clojure 代码中显式管理它?
最佳答案
从广义上讲,是的,Clojure 的行为 go
使用“ parking ”时宏类似于“goroutines”<!
和 >!
.
但是,任何性能影响都可能高度特定于工作负载和环境:操作系统、内核数量、堆大小等。
Clojure 的 go
宏将其内容编译成一个由许多小函数组成的状态机,这些函数是 dispatched通过标准 Java thread pool .现在 Clojure 实现中没有实现任何其他调度。
Go 语言有自己的“goroutines”内部调度程序,它可以根据内部运行时知识进行更复杂的调度。它还提供了“goroutines”的运行时检查,这在 Clojure 的 go
中是不可能的。宏。
关于go - 比较 Clojure 的 go-blocks 与 Go 的 goroutines 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44250700/