首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在他们并行执行的时候,采取一套期货,并将其作为一个组加以封锁?

有没有办法在他们并行执行的时候,采取一套期货,并将其作为一个组加以封锁?
EN

Stack Overflow用户
提问于 2020-11-08 21:25:17
回答 3查看 112关注 0票数 0

我希望能够等待一组功能。我希望它们并行执行,但是阻塞,直到最后的未来完成。(我不希望它们像(do @(future-1) @(future-2))那样按顺序执行)

有点像

代码语言:javascript
复制
(declare long-running-fn-1)
(declare long-running-fn-2)

(let [results (wait-for-all
   (long-running-fn-1 ...)
   (long-running-fn-2 ...)]

     (println "result 1" (first results)
     (println "result 2" (second results))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-08 21:49:29

期货被添加到用于send的线程池中。只要该池中有足够多的空闲线程(其大小将略大于您可用的CPU核数),计算就立即开始。

(doall @(future ...) @(future ...))的问题是在第一个future被删除之后才创建第二个future

下面是一个稍微修改过的代码版本,它定义了两个期货(开始计算),然后再对它们进行处理;您将看到,这只需要5秒,而不是10秒:

代码语言:javascript
复制
(time
  (let [future-1 (future (Thread/sleep 5000))
        future-2 (future (Thread/sleep 5000))]
    [@future-1 @future-2]))
票数 3
EN

Stack Overflow用户

发布于 2020-11-09 09:17:58

下面是另一个示例,演示并行执行+同步取消引用:

代码语言:javascript
复制
(letfn [(mk-fut [sleep-ms res]
          (future
            (Thread/sleep sleep-ms)
            (println "return" res "after" sleep-ms "ms")
            res))]
  (let [futures (mapv mk-fut
                      (repeatedly #(rand-int 2000))
                      (range 10))]
    (mapv deref futures)))

;; return 3 after 104 ms
;; return 8 after 278 ms
;; return 0 after 675 ms
;; return 6 after 899 ms
;; return 1 after 928 ms
;; return 2 after 1329 ms
;; return 9 after 1383 ms
;; return 4 after 1633 ms
;; return 5 after 1931 ms
;; return 7 after 1972 ms
;;=> [0 1 2 3 4 5 6 7 8 9]

(输出输出的顺序在不同的调用之间会有所不同,而生成的向量将是相同的),您可以看到所有的期货都是并行运行的,而生成和取消引用的顺序是特定的。

票数 3
EN

Stack Overflow用户

发布于 2020-11-10 10:58:52

使用pcallspvalues

代码语言:javascript
复制
test1.core=> (pcalls #(inc 1) #(dec 5))
(2 4)
test1.core=> (pvalues (inc 1) (dec 5))
(2 4)

在内部,它们使用pmap,它并行地执行函数,并在处理所有函数时返回延迟的结果序列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64743196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档