等待承诺的集合?

时间:2015-07-06 17:38:12

标签: concurrency clojure promise core.async

我有一系列的承诺。我想等到他们全部可用,然后deref得到整个向量。

我的实际用例是using HTTPKit来制作一些并发请求,然后在返回所有请求时处理它们。

收集的顺序很重要,但可以在活动结束后进行伪造和重新订购。

我目前正在做这样的事情:

qs

所有查询都是在map绑定中发布的,然后地图会依次阻止每个查询,直到它在[a+b for a in range(n) for b in range(n)]中删除。

这会达到我想要的结果吗?

1 个答案:

答案 0 :(得分:4)

这个实现最初可能会起作用,特别是如果您通过传递查询网址向量来单独测试函数,因为Clojure使用chunked sequences以及它们如何&# #39;由map函数处理。但是,你不应该依赖于这种行为,因为如果调用代码开始传入一些非分块序列(例如列表,或者由谁知道什么计算的另一个懒惰序列),你就会失去并行性。输入)。

请注意,map是惰性的,因此将qs绑定为(map http/get queries)会产生一个 lazy 序列,在此之前不会提交请求&# 39;被迫这样做。 (map #(json/read-str (:body @%)) qs)返回另一个将处理(懒惰)qs序列的惰性序列,提交API调用,然后在函数调用者请求时一次阻塞一个事实,使错误更加复杂。返回序列中的项目。在最糟糕的情况下,您的API请求将按顺序提交。

为了确保您的所有请求都是并行提交的,并且已收到所有回复,请将您map(请求和deref)的来电包裹在doall内,这将是强迫评估懒惰序列。