Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 可从Futures观察到-从多个线程观察到onNext_Scala_Rx Java_Observable_Rx Scala - Fatal编程技术网

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
的默认实现。