go - 比较 Clojure 的 go-blocks 与 Go 的 goroutines 的用法

标签 go clojure

我试图了解 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/

相关文章:

pointers - 指针的指针的内存地址

go - 如何使用 Gokogiri 将文本节点转换为 Go 中的字符串?

core.matrix 中的矩阵乘法

Clojure 通勤和改变性能

clojure - 表示 X 的特定子集在 core.logic 中具有属性 Y

reactjs - 使用 Kubernetes 部署并通过 Ingress 连接后 SSE 中断

go - 包装 io.PipeReader 来存储进度

go - 通过模块升级golang

file-io - 为什么 line-seq 返回 clojure.lang.Cons 而不是 clojure.lang.LazySeq?

clojure - 有没有办法简化 map 中的 map ?