gpt4 book ai didi

multithreading - 如何在 Clojure 中使用轻量级线程?

转载 作者:行者123 更新时间:2023-12-01 06:14:50 25 4
gpt4 key购买 nike

我试图用 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!"))

除了它不使用线程。

  1. 如何编写“轻量级”线程(或 Clojure 术语中的等效内容)?
  2. 这段代码几乎是从帝国编程风格直接翻译过来的。惯用的写作方式是什么?

最佳答案

注意术语:使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com