作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图用 Clojure 重写这段 Rust 代码:
fn main() {
let nums = [1, 2];
let noms = ["Tim", "Eston", "Aaron", "Ben"];
let mut odds = nums.iter().map(|&x| x * 2 - 1);
for num in odds {
spawn(proc() {
println!("{:s} says hello from a lightweight thread!", noms[num]);
});
}
}
这是与上述 Rust 代码几乎相同的 Clojure 代码
(def noms ["Tim", "Eston", "Aaron", "Ben"])
(doseq [i (take-nth 2 (rest noms))]
(println i "says hello from a lightweight thread!"))
除了它不使用线程。
最佳答案
注意术语:使用 futures 的 clojure 示例不会创建轻量级线程,而是创建 native 操作系统线程。 Rust 默认情况下做同样的事情,但它有一个绿色线程运行时提供轻量级语义。引用:http://rustbyexample.com/tasks.html
Clojure 默认不支持轻量级线程,但您可以通过库 core.async 创建它们.所以代码看起来像这样:
(require '[clojure.core.async :as async :refer :all])
(doseq [i (take-nth 2 (rest noms))]
(go (print (str i " says hello from a lightweight thread!\n"))))
上面的 go
宏将创建一个适当的轻量级线程 *
* 正如评论中指出的那样,该声明并不明确,因此我将尝试澄清:core.async 由 Java 线程池支持,但是 go
宏将您的代码转换为使用“ parking ”而不是“阻塞”的状态机。这仅意味着您可以拥有数以万计的由有限数量的真实线程支持的 go block 。
但是,如 post 所解释的那样,当使用阻塞 IO 时,这种好处会受到阻碍。 @hsestupin 指的是下面。
要了解 core.async 如何设法在 JVM 上拥有轻量级线程,我建议从这里开始:https://www.youtube.com/watch?v=R3PZMIwXN_g - 这是深入了解 go
宏内部结构的精彩视频。
宏本身实现了here
关于multithreading - 如何在 Clojure 中使用轻量级线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27001336/
我是一名优秀的程序员,十分优秀!