我试图了解Clojure的Go-blocks与Go的goroutines的实现特性以及由此产生的性能。
在Clojure中>!!
和<!!
阻塞当前线程,这意味着它们只能在明确创建线程时使用(否则只会阻止&#34;主线程被阻塞)。 >!
和<!
正在停放,因为go
宏管理了一个隐含的状态机,它可以处理多个&#34;进程&#34;。
然而,在Go中,这一切都隐藏在运行时中,其中goroutines扮演两个角色。
如果仅使用停车版本,Clojure代码将等同于Go,这是正确的吗?由于go
宏中有一个线程池,这就像Go的网络池底层goroutines一样。除了性能会更差,因为Go在运行时执行此操作,而Clojure在Clojure代码中显式管理它?
答案 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
宏无法实现的。