繁体   English   中英

Spring Reactor调度程序锁定

[英]Spring Reactor scheduler lock

谁能解释为什么这段代码永不结束(总是抛出TimeoutException),3.0.7和3.1.0.M3都一样吗? 我认为剩下的4个线程将逐个完成它们的工作。

private static class Holder {
    private final int group, idx;

    Holder(int group, int idx) {
        this.group = group;
        this.idx = idx;
    }
}

private static final Logger log = LoggerFactory.getLogger(RxTest2.class);

@Test
public void test1() throws Exception {
    final Scheduler scheduler = Schedulers.parallel();
    final AtomicInteger c = new AtomicInteger();

    Flux.range(0, 8).flatMap(gi -> Flux.range(0, 30).map(i -> new Holder(gi, i)))
        .groupBy(h -> h.group)

        .parallel()
        .runOn(scheduler)

        .flatMap(chunk -> {

            log.debug("chunk {}", chunk.key());

            chunk
                .parallel()
                .runOn(scheduler)
                .flatMap(h -> {
                    log.debug("{} - {}", h.group, h.idx);
                    c.incrementAndGet();
                    return Mono.just(true);
                })
                .sequential()
                .blockLast();

            return Mono.just(true);
        })
        .sequential()
        .timeout(Duration.ofSeconds(2))
        .doOnTerminate(() -> log.debug("count: {}", c.get()))
        .blockLast();
}

如果我将其拆分为单独的调度程序(Schedulers.newParallel(“ p1”,8),Scheduler.newParallel(“ p2”)),则一切正常

是否有一些特殊规则来为调度程序计算线程数?

您似乎在Schedulers.parallel()上运行了多个并行计算,并且它们完全饱和了调度程序,因此没有线程可用于处理.flatMap(chunk -> 。这里有线程饥饿的情况。只需删除内部chunk.parallel ,不需要这样做,因为计算已经是并行的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM