从内部超时迭代器映射的Scala惯用方法?

时间:2018-06-13 17:45:00

标签: scala iterator future

我有一个生产者和消费者体系结构,我的生产者返回一个迭代器,我的消费者期待一些转换结果。他们两个都不受我的控制。现在我的代码负责转换源流。一个问题是源吞吐量不可靠。它将以不同的速率生成记录。有时候太慢了。

是否可以在地图阶段中终止流?我有一个标志,我可以设置杀死这个过程。我不能把期货和超时放在消费者BTW之外。

我尝试的事情:

在地图中击杀。当没有记录生成一段时间然后从未触发此条件时,这会有缺点。

source.map(x=> {if(System.currentTimeMillis()>limit) kill(); x})

另一种选择是使用一段时间。但是,它无法从中获益。

while(source.hasNext()){
    Try(Await.result(Future{source.next()}, limit))
    match {
        case _@Failure(e)=> kill()
        case bla..
    }
}

同样的任何创新想法?

2 个答案:

答案 0 :(得分:1)

如果没有关于你正在处理的类型的更多细节,就很难掌握这种情况。

我想知道你是否不能用你自己的变换器Iterator包裹源Iterator

class Transformer[A,B](src :A) extends Iterator[B] {
  private var nextB :B = _
  def hasNext :Boolean = {
    // pull next element from src
    // if successful load nextB and return true else return false
  }

  def next() :B = nextB
}

然后,您只需让toStream创建一个Stream[B],在某些时候会终止。

sendToConsumer((new Transformer(source)).toStream)

答案 1 :(得分:0)

好的,我将重温jwvh的回答。添加迭代器的详细信息。我正在使用Try预取下一个的结果,所以我们不必为期货两次。一次用于hasNext,一次用于下一次。

{{ form.instance.id }}