为什么njoin
在处理之前预取数据?这似乎是一种不必要的复杂问题,除非它与流程的进程如何合并有关?
我有一个流,只要生成一个新元素就会生成效果。我希望将效果保持在最低限度,因此每当njoin
使用maxOpen = 4
时,4应该是同时生成的最大元素数(除非它应该生成任何元素)可以立即处理。)
有没有办法用njoin
优雅地解决这个问题?现在我正在使用一个有限的“票证”队列(只有在获得票证后才会生成一个元素)。
答案 0 :(得分:1)
请参阅https://github.com/scalaz/scalaz-stream/issues/274,特别是djspiewak的以下评论。
"从概念层面来看,这里的问题是" pull"之间的接口点。过程模型和"推送"任何并发流合并所需的模型。 Wye和njoin都坐在这个边界点,并且"欺骗"通过主动拉动其源进程来填充入站队列,将结果推送到出站队列,等待拉出输出进程。 (显然,wye和njoin都通过Actor隐藏入站队列)在大多数情况下,这非常有效,它保留了用户关心的大多数属性(例如终止传播,背压等)。&#34 ;
njoined的第二个参数maxQueued限制了预取的数量。如果该参数为0,则队列大小没有限制,因此对预取没有限制。 mergeN的文档调用njoin解释了这种预取行为的原因。 "内部mergeN保持小缓冲区,其前导读数n
A
,其中n
等于活动源流的数量。这并不意味着在这个预读缓存中查询了每个source
进程,它只是在进程以几乎相同的速度提供A
时尽可能公平。"因此,似乎njoin正在处理当所有源几乎同时提供值时会发生什么的问题,但是它试图阻止任何一个连接的流挤出较慢的流。