[英]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.