异步并发编程

r囧r小猫 2022-03-20 09:30 378阅读 0赞

异步事件驱动开发

web flux

reactive

async

Vert.x异步编程

什么是Vert.x

是一个在JVM平台构建reactive应用的工具箱

  • 基于Netty
  • 多语言支持
  • 多模块支持(数据库、日志、服务发现)

为什么要用Vert.x

Reactive编程模型性

  • 函数式
  • 异步
  • 非阻塞
  • web 技术栈
  • 适合嵌入式或微服务应用

Vert.x核心概念

  • 线程和编程模型

    • 异步I/O(async i/o)
    • 事件循环 (Event loop)
  • 事件总线(Event Bus)

    依赖添加


    io.vertx
    vertx-core
    3.6.0



    io.vertx
    vertx-web
    3.6.0

示例一:

  1. public class VertxDemo {
  2. public static void main(String[] args) {
  3. Vertx vertx = Vertx.vertx();
  4. // vertx.setPeriodic(500,System.out::println);
  5. // vertx.setPeriodic(500,System.out::println);
  6. // vertx.setPeriodic(500,System.out::println);
  7. // Executors.newScheduledThreadPool(1)
  8. // .schedule(() -> System.out.println("sxs"),1000, TimeUnit.MILLISECONDS);
  9. vertxEventBusDemo(vertx);
  10. vertxDemo(vertx);
  11. vertx.close();
  12. }
  13. private static void vertxEventBusDemo(Vertx vertx) {
  14. String address = "test-address";
  15. // 事件订阅
  16. vertx.eventBus().consumer(address,message -> {
  17. Object body = message.body();
  18. System.err.printf("Address: %s -> message: %s\n", address, body);
  19. }).completionHandler(handler ->{
  20. System.err.println("消费完成...");
  21. });
  22. // 事件发布
  23. vertx.eventBus().publish(address, "hello world !");
  24. vertx.eventBus().publish(address, "sxs !");
  25. }
  26. private static void vertxDemo(Vertx vertx){
  27. vertx.deployVerticle(new AbstractVerticle() {
  28. @Override
  29. public void start(Future<Void> startFuture) throws Exception {
  30. System.out.println("start");
  31. startFuture.complete();
  32. }
  33. @Override
  34. public void stop(Future<Void> stopFuture) throws Exception {
  35. System.out.println("stop");
  36. }
  37. });
  38. }
  39. }

web示例二:

  1. public class VertxWebDemo {
  2. public static void main(String[] args) {
  3. Vertx vertx = Vertx.vertx();
  4. // 创建Http服务
  5. vertx.createHttpServer().requestHandler(handler ->{
  6. // 请求
  7. String requestMsg = handler.getParam("request");
  8. // 响应
  9. HttpServerResponse response = handler.response();
  10. response.end("hello " + requestMsg);
  11. // 监听端口
  12. }).listen(8080);
  13. }
  14. // 执行结果
  15. // 访问 http://localhost:8080/?request=123
  16. // 页面显示 hello 123
  17. }

Reactor Streams并发编程之Reactor

  • 理解Reactor Streams编程
  • 了解Reactor基本使用
  • 复制了解WebFlux

Reactive Streams 规范

Reactor Streams 框架

WebFlux -> Reactor -> Reactor Streams API

  • 如果是CPU密集型,Reactive无济于事
  • 1 Thread CPU占满了,其他线程不得不等待

Reactive 编程

是一种异步编程的示范,这种示范与数据流式处理以及变化传播相关联,同时经常被面向对象语言表示,作为一种观察者模式的扩展。

  1. 使用多线程的两个典型的场景:
  2. 1)并发,通过并发实现对低速io访问的延迟隐藏,以及防止界面的阻塞。典型场景,多线程下载,后台打印等等。
  3. 2)并行,当系统上有超过1CPU的时候,通过并行算法让每个处理器执行计算任务的一部分,共同完成计算来提高速度。
  4. 多线程编程的缺点:
  5. 1)线程切换是有开销的,这会导致程序运行变慢。
  6. 2)多线程程序必须非常小心地同步代码,否则会引起死锁。
  7. 3)多线程程序极难调试,并且一些bug非常隐蔽,可能你99次运行都是对的,但是有1次是错的。不像单线程程序那么容易暴露问题。

发表评论

表情:
评论列表 (有 0 条评论,378人围观)

还没有评论,来说两句吧...

相关阅读

    相关 异步编程

    及面试题:并发与并行的区别? 异步和这小节的知识点其实并不是一个概念,但是这两个名词确实是很多人都常会混淆的知识点。其实混淆的原因可能只是两个名词在中文上的相似,在英文...

    相关 异步编程

      如果需要 I/O 绑定(例如从网络请求数据或访问数据库),则需要利用异步编程。     C\ 拥有语言级别的异步编程模型,它使你能轻松编写异步代码,而无需应付回叫...