gpt4 book ai didi

clojure - 如何在 Clojure 中执行同步并行功能?

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

我有一个应用程序,它有一个可以并行完成的初始流程:

  1. 获取两个 JSON 文档(我为此使用 clj-http)
  2. 解析这些文件(只提取需要的数据)
  3. 加入结果
  4. 将它们转储到一个文件中

所以有这样的事情:

some-entry-point
/\
/ \
/ \
/ \
fetchA fetchB
| |
| |
parseA parseB
\ /
\ /
\ /
\ /
\/
join
|
|
dump

实现该目标的正确且最新的方法是什么?

目前我发现的是:

最佳答案

因为这里正好有两个分支,所以最好使用 future 将并行作业分派(dispatch)给单独的线程。功能。 future将返回一个 future 的对象(一个特殊的 promise ,将在工作完成时自动解决)。

这是它的样子:

(defn some-entry-point
[obja objb]
(let [pa (-> (fetchA obja)
parseA
future)
pb (-> (fetchB objb)
parseB
future)]
(-> (join @pa @pb)
dump)))

@ 这是deref 的快捷方式(阅读器宏)功能。

当然,您可以在主线程中执行其中一个分支,只创建一个 future 对象:

(defn some-entry-point
[obja objb]
(let [p (-> (fetchB objb)
parseB
future)]
(-> (fetchA obja)
parseA
(join @p)
dump)))

您还可以使用一些通用的fetchparse 函数,使用pmap 来推广这种方法来获取和解析多个对象。对于并行化:

(defn some-entry-point
"Fetch and parse multiple objects in parallel"
[objs]
(->> objs
(pmap (comp parse fetch))
(apply join)
dump))

关于clojure - 如何在 Clojure 中执行同步并行功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30703948/

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