比较Clojure的go-blocks与Go的goroutines

时间:2017-05-29 21:50:58

标签: go clojure

我试图了解Clojure的Go-blocks与Go的goroutines的实现特性以及由此产生的性能。

在Clojure中>!!<!!阻塞当前线程,这意味着它们只能在明确创建线程时使用(否则只会阻止&#34;主线程被阻塞)。 >!<!正在停放,因为go宏管理了一个隐含的状态机,它可以处理多个&#34;进程&#34;。

然而,在Go中,这一切都隐藏在运行时中,其中goroutines扮演两个角色。

如果仅使用停车版本,Clojure代码将等同于Go,这是正确的吗?由于go宏中有一个线程池,这就像Go的网络池底层goroutines一样。除了性能会更差,因为Go在运行时执行此操作,而Clojure在Clojure代码中显式管理它?

1 个答案:

答案 0 :(得分:1)

从广义上讲,是的,Clojure的$filename = "menuitems.csv"; $fp = fopen($filename, "r"); while ($data = fgetcsv($fp, filesize($filename), ",")) { if (trim($data[0]) == '') break; $href = strtolower(substr($data[1], 0, 7)); if ($href == "http://") print "<li> <a href=\"" . data[1] . "\" target=\"_blank\">" . $data[0] . "</a></li>\n"; else print "<li> <a href=\"" . data[1] . "\" >" . $data[0] . "</a></li>\n"; } fclose($fp); echo "</ul>\n"; echo "</div>\n"; 宏的行为类似于&#34; goroutines&#34;当使用&#34;停车&#34; go<!

但是,任何性能影响都可能高度特定于工作负载和环境:操作系统,内核数量,堆大小等。

Clojure的>!宏将其内容编译成由许多小函数组成的状态机,这些函数通过标准Java dispatched thread pool。目前还没有在Clojure实现中实现任何其他调度。

Go语言有自己的内部调度程序,用于&#34; goroutines,&#34;这可能能够基于内部运行时知识进行更复杂的调度。它还提供&#34; goroutines&#34;的运行时检查。这是Clojure go宏无法实现的。