Clojure 在JVM中将数据流传输到调用者
我有一个函数,它定期获取数据,然后停止获取数据。此函数必须将其定期获取的数据返回给函数的调用方Clojure 在JVM中将数据流传输到调用者,clojure,stream,jvm,core.async,Clojure,Stream,Jvm,Core.async,我有一个函数,它定期获取数据,然后停止获取数据。此函数必须将其定期获取的数据返回给函数的调用方 当它变得 一枪 第二种方法是一种简单的实现方法,即阻塞调用者,获取所有数据,然后一次性发送 但是我想实现第一个(我想避免回调)。这里要用的东西是什么?如果是,怎么做?如果不是,如何返回调用方可以查询数据的内容,并在返回没有更多数据的信号时停止 注意:我在JVM生态系统中,具体来说是clojure。我已经看过clojure库core.async,它解决了通道使用中的此类问题。但我在想是否还有其他类似的方
但是我想实现第一个(我想避免回调)。这里要用的东西是什么?如果是,怎么做?如果不是,如何返回调用方可以查询数据的
内容,并在返回没有更多数据的信号时停止
注意:我在JVM生态系统中,具体来说是clojure。我已经看过clojure库core.async
,它解决了通道使用中的此类问题。但我在想是否还有其他类似的方法(假设streams是可以使用的)。
Java代码片段
//Function which will periodically fetch MyData until there is no data
public Stream<MyData> myFunction() {
...
}
myFunction().filter(myData -> myData.text.equals("foo"))
//函数,它将定期获取MyData,直到没有数据为止
公共流myFunction(){
...
}
myFunction().filter(myData->myData.text.equals(“foo”))
您可能需要检查(似乎不再维护?也许您可以使用seq
——默认情况下它是惰性的(如流),以便调用方可以决定何时将数据拉入。当没有更多数据时,myFunction
可以简单地结束序列。在执行此操作时,您还可以在myFunction
中封装一些优化,例如批量获取数据,以最大限度地减少往返。或者根据原始要求定期获取数据
下面是一个简单的实现:
(定义我的函数[]
(让[第100批]
(->>(范围)
(映射#)(让[从(*批次%)
至(+从批次中)]
(数据库从获取到)))
;在我们从db get获取数据时进行
(暂时停止身份)
;;返回为单个序列/流
(应用concat)))
;; 将其用作普通序列/流
(->>(我的功能)
(过滤奇数?)
其中db get
类似于:
(defn db get[from to]
;仅返回前1000条记录,即返回零表示完成
(当(<从1000开始)
;返回一系列记录
(范围从到)
这里不能使用流式解决方案吗?我不想在这里使用可观测数据,一个通道可能是一个很好的解决方案,但我建议查看Rx,因为它看起来像是一个更接近的匹配,但你必须做出判断core.async
也很适合,如果您可以调用一个函数,该函数将返回一个通道,其中0个或更多值将在将来可用。记住,渠道就像一条传送带,所以它们不能永远增长。这里有一个很好的教程:您需要更具体地了解调用/下游代码的外观。除了core.async
,您还可以返回一个future
,例如。@AlanThompson什么的未来?这就是问题所在myFunction
最终将返回MyData
的数组/Seq/List
,但是MyData
的每个块在单独的时间帧内可用。例如,返回一个Future
是不可取的,因为当Future完成时,我会再次得到MyData
的所有块作为列表。相反,我希望能够在获取MyData
块时将其传递给调用方,让调用方收集所有数据,并将其作为列表或以他们希望的方式进行处理。如果我删除行apply concat
,您的答案就会起作用。在返回之前,它将等待所有结果。不知道为什么会这样?