【发布时间】:2016-09-17 23:08:44
【问题描述】:
考虑这样的数据集:
(def data [{:url "http://www.url1.com" :type :a}
{:url "http://www.url2.com" :type :a}
{:url "http://www.url3.com" :type :a}
{:url "http://www.url4.com" :type :b}])
应该并行请求这些 URL 的内容。根据项目的 :type 值,这些内容应由相应的函数解析。一旦所有响应到达,解析函数就会返回集合,这些集合应该被连接起来。
所以我们假设有函数parse-a 和parse-b,当它们被传递一个包含HTML 内容的字符串时,它们都返回一个字符串集合。
看起来core.async 可能是一个很好的工具。一个人可以为每个项目或一个单独的通道具有单独的通道。我不确定在这里哪种方式更可取。对于多个通道,可以使用传感器进行后处理/解析。还有一个特殊的promise-chan 可能在这里合适。
这是一个代码草图,我正在使用基于回调的HTTP kit 函数。不幸的是,我在 go 块中找不到通用解决方案。
(defn f [data]
(let [chans (map (fn [{:keys [url type]}]
(let [c (promise-chan (map ({:a parse-a :b parse-b} type)))]
(http/get url {} #(put! c %))
c))
data)
result-c (promise-chan)]
(go (put! result-c (concat (<! (nth chans 0))
(<! (nth chans 1))
(<! (nth chans 2))
(<! (nth chans 3)))))
result-c))
结果可以这样读取:
(go (prn (<! (f data))))
【问题讨论】:
-
您的问题具体是什么?
标签: clojure core.async