了解缓冲操作的工作原理

时间:2018-03-27 17:39:02

标签: project-reactor

auto matcher = AnyOf(ContainerEq(v),ContainerEq(v1));

EXPECT_CALL(a, f(matcher, matcher));

以上代码打印:(至少在第一分钟内):Flux.interval(Duration.ofMillis(100)) .map(i -> 0) .buffer(Duration.ofMillis(200)) .filter(list1 -> list1.size() != 2) .subscribe(System.out::println, Throwable::printStackTrace, System.out::println);

为什么呢?我根本不期待任何打印。

1 个答案:

答案 0 :(得分:1)

<!doctype html> <html> <link rel="stylesheet" href="static/filmv2.css"> <script> function getids(in_var){ if (isNaN(in_var)){ var ret_val = "invalid film id" + in_var; } else{ var ret_val = "Valid film id" + in_var; } return ret_val; } var func_ret = 0 {% for row in rows %} func_ret = getids({{row[0]}}); document.getElementById("id_fdbk").innerHTML = func_ret; func_ret; {% endfor %} document.getElementById("testHTML").innerHTML = "Test text to HTML id"; </script> <body> <h1> Find maximum film ID </h1> <h2> Generate next free film ID </h2> <input type='button' value='Go' onclick='getids(017)';'> <p id="id_fdbk"></p> <p id="testHTML"></p> </body> </html> 运算符只有一个保证,即在每个指定的时间间隔内,将安排生成.interval事件的任务。

不幸的是,没有保证计划任务将在提交后立即执行。

这是因为潜在的onNext的未终止行为。 换句话说,Scheduler是运营商,它安排一些事件并在一段时间内重复它。这里的问题是,任何计划的操作都依赖于调度该操作的Flux.interval。在Reactor的情况下,它是一组线程或换句话说ThreadPool(在Reactor世界中它是Thread)。这里的问题是操作的执行可能稍后发生(但不是更早),因为在Thread的情况下,底层系统调度程序可能会给另一个Thread或另一个执行执行时间,所以不能保证这一点。专用Scheduler会饿死CPU循环,或者在ThreadPool的情况下有一个ThreadPool的队列,反过来又有可能会有更早的执行的更重要的任务。

这意味着间隔时间会延迟。反过来,这意味着3个任务可能会在缓冲区中。所有Thread保证是间隔任务将按照指定的间隔进行调度(在您的情况下是200毫秒)