Scalaz-stream chunking UP to N.

时间:2015-08-28 04:40:59

标签: scala scalaz scalaz-stream

给出如此的队列:

val queue: Queue[Int] = async.boundedQueue[Int](1000)

我想拉下这个队列并将其流式传输到下游接收器中,最多为100个。

queue.dequeue.chunk(100).to(downstreamConsumer) 

有点工作,但如果我说101条消息,它就不会清空队列。将剩下1条消息,除非另外99条被推入。我想尽可能多地从队列中取出100个,就像我的下游进程可以处理的那样快。

是否有现有的组合器?

2 个答案:

答案 0 :(得分:0)

为此,您可能需要在从队列中出队时监视队列的大小。然后,如果大小达到0,你就不会等到任何更多的元素。实际上,您可以根据队列的大小实现批处理的elastic大小调整。即:

val q = async.unboundedQueue[String]

val deq:Process[Task,(String,Int)] = q.dequeue zip q.size
val elasticChunk: Process1[(String,Int), Vector[String]] = ???
val downstreamConsumer : Sink[Task,Vector[String]] = ???

deq.pipe(elasticChunk) to downstreamConsumer

答案 1 :(得分:0)

我实际上是按照我原本想要的方式解决了这个问题。

scalaz-stream队列现在包含dequeueBatch方法,该方法允许队列中的所有值,最多N个或块出列。

here