异步编程实战之webflux

一, 快速搭建webflux项目

1, 引入相关依赖

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.6.5</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- 解决mac系统Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider异常 -->
<dependency>
  <groupId>io.netty</groupId>
  <artifactId>netty-all</artifactId>
  <version>4.1.72.Final</version>
</dependency>

启动类还是原来的@SpringBootApplication.

如果想要跳转指定静态页面,需要注入RouterFunction

@Value("classpath:pages/index.html")
private Resource indexHtml;
@Bean
public RouterFunction<ServerResponse> route(){
  return RouterFunctions
      .route(RequestPredicates.GET("/"),request -> pageRespons(indexHtml))
      .andRoute(RequestPredicates.GET("/flux"),request -> fluxRespons());
}
private Mono<ServerResponse> fluxRespons() {
  Stream<Integer> randomStream = new Random().ints().map(i -> {
    try {
      Thread.sleep(3000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return i;
  }).boxed();
  Flux<Integer> flux = Flux.fromStream(randomStream);
  return ServerResponse.ok().contentType(MediaType.TEXT_EVENT_STREAM).body(flux,Integer.class);
}
private Mono<ServerResponse> pageRespons(Resource indexHtml) {
  return ServerResponse.ok().contentType(MediaType.TEXT_HTML).body(DataBufferUtils.read(indexHtml,new DefaultDataBufferFactory(),4096),DataBuffer.class);
}

在resources目录下创建pages目录,pages下创建index.html

<html>
<head></head>
<body>
home
</body>
</html>

二, 相关API使用说明

1, webflux返回值一般有Mono或Flux包装

2, webflux是懒加载,不能像传统那样写逻辑,需要return Mono或return Flux并且一个方法里只能return一个,其他逻辑需要在这个逻辑里面return;如果存在多个并行的逻辑,可以通过zip或zipWith来进行连接

3, zip与zipwith用法:

zip连接多个Mono,并且每个Mono的返回值要一致;

zipWith连接一个Mono,多个zipwith嵌套使用允许不同的返回值.

4, mono里的doOnSuccess/doOnXX是在zip、zipwith执行完后才会执行

5, subscribe也是在zip、zipwith执行完后才会执行

6, Mono的mapNotNull/switchIfEmpty是在该Mono执行完后执行,按照Mono返回的对象互斥执行

7, Mono.defer()与Flux.defer()区别在于:前者返回Mono对象,后者返回Flux对象集合.

8, Mono> 转Flux与Flux转Mono>

Flux.collectList()->转Mono>Mono>.flatMapMany(Flux::fromIterable)转Flux

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python异步编程是一种编写高效、非阻塞的代码的方式,它可以提高程序的性能和响应能力。在传统的同步编程中,当一个任务执行时,程序会一直等待该任务完成后才能执行下一个任务。而在异步编程中,可以同时执行多个任务,不需要等待某个任务完成才能执行下一个任务。 Python提供了多种异步编程的方式,其中最常用的是使用asyncio库。asyncio库是Python 3.4版本引入的标准库,它提供了一套完整的异步IO框架,可以用于编写协程、异步函数和异步上下文管理器。 在异步编程中,关键的概念是协程(coroutine)。协程是一种特殊的函数,可以在执行过程中暂停并恢复。通过使用async和await关键字,可以定义协程函数和协程对象。协程函数可以被调用并返回一个协程对象,协程对象可以被调度执行。 异步编程中常用的一些概念和技术包括: 1. 异步函数:使用async关键字定义的函数,可以在函数内部使用await关键字来等待其他协程的执行结果。 2. await表达式:用于等待其他协程的执行结果,并暂停当前协程的执行。 3. 事件循环(Event Loop):负责调度和执行协程,将协程放入任务队列中,并在适当的时候执行它们。 4. Future对象:表示一个异步操作的结果,可以通过await表达式获取其最终的返回值。 5. 回调函数:在异步操作完成时被调用的函数,用于处理异步操作的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Loren_云淡风轻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值