首页 > 编程语言 >反应式编程 (Reactive programming)

反应式编程 (Reactive programming)

时间:2023-07-26 11:55:46浏览次数:53  
标签:异步 Reactor 编程 programming Reactive 事件 序列 反应式

反应式编程(Reactive programming,Rx)

最初来源于函数式语言里面的函数式反应编程(Functional Reactive programming,FRP)。

后来随着微软.Net Framework增加了Reactive Extension而在主流语言中流行起来。

反应式编程是一种编程思想、编程方式,是为了简化并发编程而出现的。

与传统的处理方式相比,它能够基于数据流中的事件进行反应处理。

例如:a+b=c的场景,在传统编程方式下如果a、b发生变化,那么我们需要重新计算a+b来得到c的新值。

而反应式编程中,我们不需要重新计算,a、b的变化事件会触发c的值自动更新。

这种方式类似于我们在消息中间件中常见的发布/订阅模式。由流发布事件,而我们的代码逻辑作为订阅方基于事件进行处理,

并且是异步处理的。

Reactor有Spring背书,同时反应式编程已经集成于Java 9

反应式编程与Java8的Streams比较:

1)反应式编程更加强调异步非阻塞,通过onComplete等注册监听的方式避免阻塞,同时支持delay、interval等特性。

2)而Streams本质上是对集合的并行处理,并不是非阻塞的。

反应式编程的核心是基于事件流、无阻塞、异步的,使用反应式编程不需要编写底层的并发、并行代码。

 

基本概念

 1)Flux,是Reactor中的一种发布者,包含0到N个元素的异步序列。通过其提供的操作可以生成、转换、编排序列。如果不触发异常事件,Flux是无限的。

2)Mono,是Reactor中的一种发布者,包含0或者1个的异步序列。可以用于类似于Runnable的场景。 背压(backpressure),由订阅者声明的、限定本消费者可处理的流中的元素个数。

所有的流都是不可变的,所以对流的操作都会返回一个新的流。

 反应式编程的最新动态:

1)Java 9中把反应式流规范以 java.util.concurrent.Flow 类的方式添加到了标准库中;

2)Spring 5对反应式编程模型提供了内置支持,并增加了新的 WebFlux 模块来支持反应式 Web 应用的开发。

3)在前端开发中,Angular 框架也内置使用了 RxJS。

Java的Reactor库提供了一些新的类型,它们基于反应式编程模型。Flux和Mono是其中最常见的类型。

 

Flux和Mono是Reactor中的异步序列流类型。

1)Flux代表一个包含0到N个元素的异步序列;

在该序列中可以包含三种不同类型的事件:正常事件错误事件和完成事件。当事件序列完成时,会自动将流关闭,不允许添加新的元素。

2)Mono代表一个包含0或1个元素的异步序列

在该类型中同样可以包含三种不同类型的事件:正常事件错误事件完成事件。当元素被订阅时,会自动向流中发布0或1个元素

 

参考资料:

https://cloud.tencent.com/developer/article/1602301?from=15425

https://cloud.tencent.com/developer/article/1073888?from=15425

https://www.yzktw.com.cn/post/1286903.html

标签:异步,Reactor,编程,programming,Reactive,事件,序列,反应式
From: https://www.cnblogs.com/heyi-77/p/17582087.html

相关文章

  • 30 天精通 RxJS (02):Functional Programming 基本观念
    FunctionalProgramming是Rx最重要的观念之一,基本上只要学会FP要上手Rx就不难了!FunctionalProgramming可以说是近年来的显学,各种新的函式编程语言推出之外,其他旧有的语言也都在新版中加强对FP的支持!什么是FunctionalProgramming?FunctionalProgramming是一种编程......
  • Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)
    ToyotaProgrammingContest2023#4(AtCoderBeginnerContest311)A-FirstABC(atcoder.jp)记录一下\(ABC\)是否都出现过了然后输出下标#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ios::sync_with_stdio(false);cin.tie(n......
  • 「解题报告」Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)
    比赛地址:ToyotaProgrammingContest2023#4(AtCoderBeginnerContest311)-AtCoder后记:大家都太强了%%%,如果我做不出第四题就要掉分了。。。A-FirstABCA-FirstABC(atcoder.jp)找到第一个\(\texttt{A,B,C}\)三种字符都出现的位置。/*Thecodewaswrittenby......
  • The 2023 Guangdong Provincial Collegiate Programming Contest(2023广东省赛)
    链接:https://codeforces.com/gym/104369A.ProgrammingContestC++Code#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;voidsolve(){inty1,y2;cin>>y1;intn;cin>>n;vector<int>......
  • Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)——D
    https://atcoder.jp/contests/abc311/tasks/abc311_d思路题目说如果当前方向的下一个点能走,那么就一直走,否则才能转向。根据题意模拟即可,这道题的难点在于,碰到已经走过的点到底要不要走。如果当前方向走到底,其中的点之前全部都走过那么就不能再走了。我们用bfs模拟,对于能一直走......
  • vue3中组合式 API_为 reactive() 标注类型
    reactive() 也会隐式地从它的参数中推导类型<template><h3>{{book.title}}</h3><h3>{{book.author}}</h3></template><scriptsetuplang="ts">import{reactive}from"vue"constbook=reactive({title......
  • CF730I Olympiad in Programming and Sports
    想复杂了……这种分到两边的问题,考虑建立费用流模型,建立两个点\(A,B\)表示分到\(A\)的数或者分到\(B\)的数:\(S\toA\),流量\(p\),费用\(0\)。\(S\toB\),流量\(s\),费用\(0\)。\(A\toi\in[1,n]\),流量\(1\),费用\(a_i\)。\(B\toi\in[1,n]\),流量\(1\),费用\(b_i\)......
  • io.reactivex.rxjava3:rxjava
    如何使用io.reactivex.rxjava3:rxjava概述在本文中,我将向您介绍如何使用io.reactivex.rxjava3:rxjava。rxjava是一个流行的响应式编程库,它提供了丰富的操作符和工具,用于简化异步操作和事件处理。以下是我们将要讨论的步骤概览:步骤动作代码示例1添加依赖implementa......
  • 【862】as.Date in R programming
    ref:R语言——日期时间处理ref:as.Date:DateConversionFunctionstoandfromCharacterref:DateFormatsinRas.Date()itcanchangeanormalstringintoadateformat.format()Itcanextractthespecificdateformatfromadatestring.Example:>d="2......
  • 基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发2-功能开发
    基于Avalonia11.0.0+ReactiveUI的跨平台项目开发2-功能开发项目简介:目标是开发一个跨平台的AI聊天和其他功能的客户端平台。目的来学习和了解Avalonia。将这个项目部署在openKylin1.0的系统上。为什么使用Avalonia:之前已经了解了基于Avalonia的项目在国产麒麟系统中运行的......