Flux 和 Mono区别:并发并行同步异步区别

Flux 和 Mono区别

在工作中,看到导师写项目的时候用到了Flux和Mono。知识盲区了。随后去查了相关的技术信息。很遗憾说的有点太官方了。没有看懂。中午就餐之后,就问导师这两个是什么意思,以及什么区别。废话不多说,总结一下:

什么是Flux呢?

Flux代表一个包含个或多个元素的异步序列。你可以将其视为一种异步的、可以包含多个元素的容器。通常用于处理多个并行的异步操作或者事件流。

什么是Mono

Mono代表一个包含个或一个元素的异步序列。你可以将其视为一种异步的、最多包含一个元素的容器。通常用于处理只会产生一个结果的异步操作。
在响应式编程中,Flux和Mono是Reactor库中的两个核心类,用于处理异步数据流。Flux用于处理多个元素的情况,而Mono则用于处理单个元素的情况。

为什么要使用它们呢?

使用Flux和Mono有几个好处:

  • 异步编程简化:Flux和Mono提供了简洁的API,使异步编程更加容易。通过使用这两个类,你可以轻松地处理异步操作,而不必担心回调或者复杂的线程管理。
  • 响应式编程:Flux和Mono是响应式编程的核心概念。它们允许你以声明性的方式处理数据流,并且能够方便地应对数据流的变化和处理多个并发事件。
  • 组合操作:Flux和Mono提供了丰富的操作符,可以方便地对数据流进行转换、过滤、合并等操作。这些操作符使得对数据流进行复杂的处理变得简单和高效。
  • 异步和并发:Flux和Mono可以很容易地与Java的异步和并发框架集成,比如CompletableFuture和Java 8的CompletableFuture。这使得在异步和并发场景中使用Flux和Mono变得更加方便和灵活。

怎么使用它们呢?

在Java项目中使用Flux和Mono是使用Project Reactor库的常见操作。Project Reactor是一个用于构建基于响应式编程的库,它提供了Flux和Mono两个主要的数据类型,分别用于多个值和单个值的响应式流。

提供一个小示例代码:

演示如何使用各种操作符来处理响应式流
1.首先需要在java中引入依赖

<dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId><version>3.4.11</version> 
</dependency>

2.在代码中使用Flux和Mono:

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;import java.util.Arrays;
import java.util.List;public class ECommercePlatform {// 模拟从数据库中获取产品列表public static Flux<Product> getProductsFromDatabase() {List<Product> products = Arrays.asList(new Product(1, "Laptop", 1000),new Product(2, "Smartphone", 800),new Product(3, "Headphones", 200),new Product(4, "Tablet", 600));return Flux.fromIterable(products);}// 模拟从外部API获取特价产品信息public static Flux<Product> getSpecialOffers() {List<Product> specialOffers = Arrays.asList(new Product(5, "Smartwatch", 300),new Product(6, "Camera", 700));return Flux.fromIterable(specialOffers);}// 模拟从消息队列获取新产品通知public static Mono<Product> getNewProductNotification() {// 假设我们每次只收到一条新产品通知return Mono.just(new Product(7, "Speaker", 150));}public static void main(String[] args) {// 从各个数据源获取产品信息,并合并成一个FluxFlux<Product> allProducts = Flux.concat(getProductsFromDatabase(),getSpecialOffers(),getNewProductNotification());// 过滤出价格低于500的产品Flux<Product> filteredProducts = allProducts.filter(product -> product.getPrice() < 500);// 按价格升序排序产品Flux<Product> sortedProducts = filteredProducts.sort((p1, p2) -> p1.getPrice() - p2.getPrice());// 订阅最终的产品流并处理每个产品sortedProducts.subscribe(product -> System.out.println("Product: " + product));}static class Product {private int id;private String name;private int price;public Product(int id, String name, int price) {this.id = id;this.name = name;this.price = price;}public int getId() {return id;}public String getName() {return name;}public int getPrice() {return price;}@Overridepublic String toString() {return "Product{" +"id=" + id +", name='" + name + '\'' +", price=" + price +'}';}}
}

我们首先从数据库、外部API和消息队列中获取产品信息,然后使用concat操作符将它们合并成一个Flux。然后,我们使用filter操作符过滤出价格低于500的产品,再使用sort操作符按价格升序对产品进行排序。最后,我们订阅最终的产品流,并打印每个产品的信息。

第二问题

其中提到并发和异步,那就来加一个同步异步并发并行的区别吧

  • 同步:指的是任务按照顺序依次执行,一个任务的执行需要等待上一个任务完成后才能开始。在同步操作中,如果一个任务阻塞(比如等待I/O操作完成),则整个线程都会被阻塞,直到任务完成。

如果看不懂举一个例子理解:假设你在食堂排队打饭,每个人依次进行。当你的轮到时,你需要等待前面的人依次打饭完成才能轮到你。这就是同步的典型例子,因为你必须等待前面的任务(其他人打饭)完成后才能执行你自己的任务(打饭)。

  • 异步:指的是任务可以独立执行,不需要等待其他任务完成。在异步操作中,一个任务的执行不会阻塞其他任务的执行,可以继续执行其他任务或者等待任务完成的通知。异步操作通常通过回调函数、Promise、async/await等方式来处理。

例子理解:现在假设食堂引入了预约打饭的系统。你可以提前在手机上预约打饭的时间,并在预约的时间点到达食堂,直接取饭而无需排队等待。这种情况下,你的打饭操作与其他人的打饭操作是独立的,你不需要等待其他人完成打饭,因此是异步的。

  • 并发:指的是多个任务在同一个时间段内交替执行。虽然这些任务可能在同一时刻都在执行,但实际上它们可能会分时执行,通过时间片轮转等方式来实现。
    例子理解:假设食堂只有一条打饭线,但有多个人排队。每个人都在等待自己的食物被准备好,但是厨师可能会交替地为每个人准备食物,因此在某一时刻,多个人都在等待他们的食物,这就是并发。尽管只有一个厨师,但是他可以交替为不同人准备食物,实现了并发操作。
  • 并行:指的是多个任务同时执行,每个任务都在独立的处理器上执行,不会相互干扰。并行可以通过多核处理器、分布式系统等方式来实现。

例子理解:现在假设食堂有多条打饭线,每条线路都有自己的厨师。这样,多个人可以同时打饭,每个人的打饭操作都在独立的线路上进行,彼此互不影响。这就是并行操作,因为多个任务(打饭操作)同时进行,每个任务都在独立的线路上并行执行。
加油伙伴!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一练 | 华为认证真题练习Day213

1、下面哪些OSPF状态迁移是可能的&#xff08;多选&#xff09; A. DOWN->INIT B. DOWN->2-WAY C. LOADING->FULL D. INIT->2-WAY 2、如果需要在某网段上进行快速失效检测机制&#xff0c;则在下列可能实现的配置方法中&#xff0c;描述错误的是:&#xff08;多…

LeetCode - 1702. 修改后的最大二进制字符串

文章目录 解析AC CODE 题目链接&#xff1a;LeetCode - 1702. 修改后的最大二进制字符串 解析 详细题解&#xff1a;贪心&#xff0c;简洁写法&#xff08;Python/Java/C/Go/JS/Rust&#xff09; 思路很牛b。 简单来说我们需要想办法将0配对&#xff0c;将其变为10&#xff0…

K8S:常用资源对象操作

文章目录 一、使用Replication Controller(RC)、Replica Set(RS) 管理Pod1 Replication Controller&#xff08;RC&#xff09;2 Replication Set&#xff08;RS&#xff09; 二、Deployment的使用1 创建2 滚动升级3 回滚Deployment三、 Pod 自动扩缩容HPA1 使用kubectl autosc…

React + three.js 3D模型骨骼绑定

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定 项目代码(github)&#xff1a;https://github.com/couchette/simple-react-three-skeleton-demo 项目代码(gitcode)&#xff1a;https://gitcode.com/qq_41456316/simple-r…

多时间尺度源储荷协调调度策略:储能电站特性分布与电网接入

《考虑特性分布的储能电站接入的电网多时间尺度源储荷协调调度策略》&#xff08;作者&#xff1a;金力等&#xff09;这标题听起来有点拗口&#xff0c;但其实它讲的是关于电网里储能电站怎么更高效地工作的策略。 文章的背景和目的是基于当前电网面临的多时间尺度调度的挑战。…

spring(7)-事务

事务 1、 事务概述2、spring对事务的支持2.1 spring事务管理API2.2 事务属性2.2.1 事务传播行为2.2.2 案例2.2.2.1 REQUIRED2.2.2.2 REQUIRES_NEW2.2.2.3 NESTED 2.2.3 事务隔离行为2.2.3.1 测试2.2.3.2 读未提交2.2.3.3 读提交2.2.3.4 可重复读 2.2.4 事务超时2.2.5 只读事务2…

2024认证杯数学建模B题思路模型代码

目录 2024认证杯数学建模B题思路模型代码:4.11开赛后第一时间更新&#xff0c;获取见文末名片 第十三届“认证杯”数学中国数学建模比赛赛后体会 2024认证杯数学建模B题思路模型代码:4.11开赛后第一时间更新&#xff0c;获取见文末名片 第十三届“认证杯”数学中国数学建模比…

SE78图片迁移下载

SAP好像并没有标准的事务码可以方便下载已上传至SAP服务器上的图片&#xff0c;通常的解决方法写一个专门下载这类图片的简单程序来处理。 REPORT Ydownload. DATA : g_bytecount TYPE i,g_content TYPE STANDARD TABLE OFbapiconten INITIAL SIZE …

中国知网:学术资源的宝库与知识共享的平台

中国知网&#xff0c;作为国内领先的学术平台&#xff0c;始终致力于实现全社会知识资源的传播共享与增值利用。自1999年6月创建以来&#xff0c;知网已经成为了中国学术界的重要组成部分&#xff0c;为广大学者、研究人员和学生提供了一个全面、便捷的学术资源库。 一、知网的…

OpenHarmony南向开发案例:【智能垃圾桶】

样例简介 智能垃圾桶可以通过数字管家应用来监测垃圾桶当前可用容量&#xff0c;提醒主人及时处理垃圾&#xff1b;通过日程管家可以实现和其他智能设备联动。 核心组件位置功能距离传感器置于垃圾桶盖内侧感应垃圾量红外传感器置于垃圾桶前端感应是否有人靠近光敏电阻开发板…

2006-2021年各省能源消费总量数据(无缺失)

2006-2021年各省能源消费总量数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;2006-2021年 2、来源&#xff1a;能源年鉴、各省年鉴 3、范围&#xff1a;30个省 4、指标&#xff1a;能源消费总量&#xff08;万吨标煤&#xff09; 5、缺失情况&#xff1a;无缺失 …

AI人工智能讲师简历大模型讲师叶梓大模型技术与应用培训提纲

叶梓&#xff0c;工学博士&#xff0c;高级工程师。现某大型上市企业资深技术专家。 2005年上海交通大学计算机专业博士毕业&#xff0c;在校期间的主研方向为数据挖掘、机器学习、人工智能。毕业后即进入软件行业从事信息化技术相关工作&#xff1b;负责或参与了多项国家级、省…

Docker Nginx 部署Vue项目

先弄个ngix镜像&#xff0c;还原到linux里面 发布包放的位置 nginx配置文件 server {listen 8049;server_name localhost;#charset koi8-r;access_log /var/log/nginx/host.access.log main;error_log /var/log/nginx/error.log error;location / {# root 根目录&a…

Apache POI

Apache POI的使用和下载 要使用Apache POI&#xff0c;您需要下载POI库&#xff0c;并将它添加到您的项目中。 首先&#xff0c;您需要从Apache POI的官方网站&#xff08;https://poi.apache.org/&#xff09;下载POI库。在网站的“Downloads”页面上&#xff0c;找到“Bina…

Vue3报错:‘defineProps‘ is not defined no-undef

解决方法 在package.json中添加 "vue/setup-compiler-macros": true 记得在上面的 "node": true 后面加一个逗号 "eslintConfig": {"root": true,"env": {"node": true,"vue/setup-compiler-macros": t…

128.最长连续序列

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解…

高效学习:从最适合自己的地方学习

1&#xff09;一个人的学习行为&#xff0c;其实就是对新事物的认知由浅入深的过程。在这个过程中&#xff0c;一个人要高效地进行这个过程需要什么呢&#xff1f;全神贯注&#xff0c;反复琢磨。 2&#xff09;有什么东西能够让自己全神贯注&#xff0c;不惜反复琢磨&#xff…

Compose UI 之 Card 卡片组件

Card Card 是用于显示带有圆角和可选阴影的矩形内容容器。它通常用于构建用户界面,并可以包含标题、文本、图像、按钮等元素,表示界面上的可交互元素,我们称它是 “卡片”。 Card 使用的一些经典的场景: 列表数据,例如 新闻列表,产品列表等。信息提示框,使用 Card 组件…

一起学习python——基础篇(13)

前言&#xff0c;python编程语言对于我个人来说学习的目的是为了测试。我主要做的是移动端的开发工作&#xff0c;常见的测试主要分为两块&#xff0c;一块为移动端独立的页面功能&#xff0c;另外一块就是和其他人对接工作。 对接内容主要有硬件通信协议、软件接口文档。而涉…

windows软件在更新的时候,会自动找到旧版本软件的位置,这个功能如何实现 ?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …