clojure - 有没有办法在并行执行时获取一组期货并将它们作为一个组阻止?
问题描述
我希望能够等待一组功能。我希望它们并行执行,但要阻塞直到最后一个未来完成。(我不希望它们按顺序执行,例如 with (do @(future-1) @(future-2))
)
就像是
(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))
解决方案
send
Futures 被添加到定义它们时使用的同一线程池中。只要该池中有足够的空闲线程(其大小将略大于您可用的 CPU 内核数),计算就会立即开始。
问题(doall @(future ...) @(future ...))
在于第二个是在第一个被取消引用之后future
才创建的。
这是您的代码的略微修改版本,它在取消引用之前定义了两个期货(开始它们的计算);你会看到它只需要 5 秒而不是 10 秒:
(time
(let [future-1 (future (Thread/sleep 5000))
future-2 (future (Thread/sleep 5000))]
[@future-1 @future-2]))
推荐阅读
- r - 以退出状态 0 停止 R 脚本
- google-bigquery - bigquery MERGE DML 与相关子查询
- mongodb - Mongodb查询$agregate $group $count等好友
- elasticsearch - 在弹性搜索中突出显示术语问题
- java - 如何在 JPA 规范中按字段区分计数查询?
- ms-access - MS Access 按字符串开头对访问报告进行排序
- haskell - 限制递归 Haskell 的深度
- google-chrome - 在 NACL 页面上启用开发人员工具
- oauth - 带有 gitlab oauth2 login.OAuthLogin(NewTransportWithCode) 的 grafana
- python - 无法找到序数 241