我有一个生产者和消费者体系结构,我的生产者返回一个迭代器,我的消费者期待一些转换结果。他们两个都不受我的控制。现在我的代码负责转换源流。一个问题是源吞吐量不可靠。它将以不同的速率生成记录。有时候太慢了。
是否可以在地图阶段中终止流?我有一个标志,我可以设置杀死这个过程。我不能把期货和超时放在消费者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..
}
}
同样的任何创新想法?
答案 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 }}