在clojure中异步合并Web响应

时间:2012-06-16 21:38:36

标签: asynchronous clojure

我正在尝试编写一段代码:

  • 通过一些请求访问2个webservice
  • 响应将是对象序列,每个对象由id标识,响应按ID按升序排序
  • 响应将很大并且流式传输(或gzip chunked)
  • 结果将是基于ID
  • 合并来自两个输入的数据

我试图实现的是,一旦响应的相应部分可用,就应该写出输出。我也不想等待整个响应到位,因为这将耗尽内存。我希望尽快开始流输出并尽可能少地保留内存。

什么是开始的好方法?

我看了一下aleph和lamina,还有async.http.client。似乎这些工具可以帮助我,但我很难弄清楚如何使用一段代码来对两个Web服务中的响应进行相同的响应。

1 个答案:

答案 0 :(得分:2)

你可以做这样的事情(使用aleph - 引擎盖下使用了lamina channel抽象)。

现在,订阅回调将在它到达任一通道时立即收到每个JSON对象,您可以拥有一个本地atom,这是一个地图,其中键是您想要组合的值2个通道的结果和值是一个向量,它将存储同一个键的值。所以这将是这样的:

  • 在回调中收到项目时,请检查本地atom地图是否已有密钥
  • 如果已经存在密钥,请使用2个项目(一个已经在地图中,另一个已经收到)进行存储或进行其他处理,然后从地图中删除密钥。
  • 如果没有密钥,请将密钥和值创建为[item],即现在正在接收的一个项目的向量。