标签:Reactor 创建 reactive 任务 线程 Scheduler CompletableFuture
从CompletableFuture到Reactor编程
通过 CompletableFuture 和 Lambda 表达式,可以快速实现轻量业务异步封装与编排,与 Callback 相比可以避免方法多层嵌套问题,但面对相对复杂业务逻辑时仍存在以下局限:
-
难以简单优雅实现多异步任务编排;
-
难以处理实时流式场景;
-
难以支持高级异常处理;
-
不支持任务延迟执行。
CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> "hello" ); // f2依赖f1的结果做转换 CompletableFuture<String> f2 = f1.thenApplyAsync(t -> t + " world" ); System.out.println("异步结果:" + f2.get());
相比 Future,基于 Reactive 模型丰富的操作符组合(filter/map/flatMap/zip/onErrorResume 等高阶函数)代码清晰易读,搭配 Lamda 可以轻松实现复杂业务场景任务编排。
Reactor模式在IO读写数据时还是在同一个线程中实现的,即使使用多个Reactor机制的情况下,那些共享一个Reactor的Channel如果出现一个长时间的数据读写,会影响这个Reactor中其他Channel的相应时间,比如在大文件传输时,IO操作就会影响其他Client的相应时间,因而对这种操作,使用传统的Thread-Per-Connection或许是一个更好的选择,或则此时使用Proactor模式。
在 Reactor 中,执行模式以及执行过程取决于所使用的 Scheduler
。
默认情况下, Reactor提供三种核心调度程序接口实现:
1. SingleScheduler:能为一个专用工作单元安排所有可能的任务,具有时间性,因此可以延迟安排定期事件。此调度程序可以使用Scheduler.single()进行引用。
2, ParallelScheduler: 适用于固定大小的工作单元池(默认情况下,收CPU内核数量限制)适合CPU密集任务,Scheduler.parallel()进行引用。
3. ElasticScheduler:可以动态创建工作单元池并缓存线程池,由于其所创建的线程池没有最大数量限制,因此此调度程序非常适合用于IO密集操作的调度,Scheduler.elastic()进行引用。
可以使用 Schedulers.fromExecutorService(ExecutorService)
基于现有的 ExecutorService
创建 Scheduler
。
Scheduler.parallel()
创建一个基于单线程 ExecutorService
的固定大小的任务线程池。 因为可能会有一个或两个线程导致问题,它总是至少创建 4 个线程。然后 publishOn 方法便共享了这些任务线程, 当 publishOn
请求元素的时候,会从任一个正在发出元素的线程那里获取元素。这样, 就是进行了任务共享(一种资源共享方式)。
Scheduler.elastic()
也能创建线程,它能够很方便地创建专门的线程(以便跑一些可能会阻塞资源的任务, 比如一个同步服务),请见 如何包装一个同步阻塞的调用?。
Reactive编程核心是背压,即nothing happens until you subscribe,在使用Reactor构建反应式流时,数据会从发布者流向订阅者,同时也会从订阅者向上传播到发布者
https://projectreactor.io/docs/core/release/reference/
http://htmlpreview.github.io/?https://github.com/get-set/reactor-core/blob/master-zh/src/docs/index.html
标签:Reactor,创建,reactive,任务,线程,Scheduler,CompletableFuture 来源: https://www.cnblogs.com/BaymaxHH/p/16350331.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。