Scala 可从Futures观察到-从多个线程观察到onNext
我想从Scala 可从Futures观察到-从多个线程观察到onNext,scala,rx-java,observable,rx-scala,Scala,Rx Java,Observable,Rx Scala,我想从期货列表的结果实时生成一个可观察的 在最简单的情况下,假设我有一个用Future.sequence运行的期货列表,我只是用一个可观察的来监视它们的进度,它告诉我每次一个期货已经完成。我基本上是这样做的: def observeFuturesProgress(futs: List[Future[Int]]) : Observable[String] = { Observable[String](observer => { val loudFutures: Lis
期货
列表的结果实时生成一个可观察的
在最简单的情况下,假设我有一个用Future.sequence
运行的期货列表,我只是用一个可观察的来监视它们的进度,它告诉我每次一个期货已经完成。我基本上是这样做的:
def observeFuturesProgress(futs: List[Future[Int]]) : Observable[String] = {
Observable[String](observer => {
val loudFutures: List[Future[Int]] = futs.map(f => {
f onComplete {
case Success(a) => observer.onNext(s"just did $a more")
case Failure(e) => observer.onError(e)
}
f
})
Future.sequence(loudFutures) onComplete {
case Success(_) => observer.onCompleted()
case Failure(e) => observer.onError(e)
}
})
}
这在我的测试环境中运行良好。但是我刚刚读到,不应该从不同的线程调用onNext
,至少不需要注意没有重叠调用。修复此问题的建议方法是什么?似乎许多实际使用的可观察对象
都需要像这样从异步代码调用onNext
,但我在文档中找不到类似的例子
被观察者必须连续地向观察者发出通知(不是以
平行)。他们可能会从不同的线程发出这些通知,
但必须有一个正式的关系发生之前,双方之间的关系
通知
看看
被观察者可以调用其观察者的方法
异步的,可能来自不同的线程。这可能会造成这样的后果
一个可观察到的事物违反了可观察到的契约,因为它可能试图
在其OnNext之一之前发送未完成或OnError通知
通知,或者它可以从两个
同时执行不同的线程你可以强迫这样一个可观察到的
通过对其应用序列化运算符,表现良好且同步。
我不确定是否有更好的答案,但如果您使用单线程执行上下文(ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor())
)来运行那些onComplete
的回调,则可以确保onNext
调用由同一线程运行。您能参考哪篇文章吗,关于onNext
您指的是什么?从我的观点来看,这个用例非常好。@mavarazy:我发现关于这个用例的很多文档都很不清楚,但是谈到了使用serialize()
来避免两个重叠的onNext()
调用,并警告您不要从多个线程调用onNext()
,至少如果您使用的是一个主题。我能找到的所有Rx官方示例都是单线程的。谢谢。当我快速浏览Serialize页面时,RXScala部分只是说TBD,没有给出实际的语法,这让我很沮丧。我不确定它是否曾经实施过。但是,编译以下语法:Observable[String](observator=>{…})。序列化
,它似乎运行正常。我还不能诚实地说,.serialize
是否有任何作用——为此,我将尝试构建一些更严格的压力测试。我也很惊讶它不是Observable
的默认实现。