【ReactiveX】介绍(译)

2023-11-01

更多内容,欢迎关注作者博客:
ReactiveX 是通过使用 Observable 序列用来合成异步的和事件响应式的程序上的库文件。
它扩展了通知者模式来支持数据和/或事件的响应队列,并且增加让你能够显示的合并序列的操作,这些操作和一些抽象概念有关,例如:低级别线程、同步、线程安全、并发数据结构,非阻塞I/O。
Observables 采用了理想的方式控制多要素的异步队列,这种方式也解决了上述问题。
它经常被叫做“函数响应式编程”,但是其实是一个误解。ReactiveX 也许是面向函数的,同样也许是面向响应式的,但是“函数响应式编程”是一个不同的东西。一个主要的区别点是,“函数响应式编程”是一个基于连续变化数据的操作,但是ReactiveX是基于离散的发射的数据的操作。

为何使用 Observables

ReactiveX Observable model 让你能够像对待
ReactiveX Observable model 让你能够像对待类似数组的集合数据的简单的和复合的操作的顺序,来对待异步事件流。它能够让你从杂乱网状的回调函数中脱身,从而能够让你的代码可读性更高,并且有更少的易发Bug。
Observables 是可组合的
像类似于 Java Future 的技术在运用到一个单一级别的异步执行的时候是简单直观的,但是当有嵌套关系的时候,他们就会增加上很多复杂性。
使用 Futures 来最佳组合有条件的异步执行流程是很困难的(或者自从各个请求在 runtime 的潜伏期变化时候,就变得不可能了)。当然,这些都能够被解决,但是他会快速的变得复杂(和错误频发),或者它会过早地阻塞在 Future.get(),也消除了异步执行的优势。
另一方面,ReactiveX Observables 被设计用来处理异步数据的组合流程和队列。
Observable 是自适应的
ReractiveX Obserables 不仅能支持单一维度的数据(类似于 Funtures do),也支持数据队列甚至是无限的数据流。Observable 是一个单一抽象体,它能够被用在任何用例上。Observable 有所有的灵活性和优雅的适应其镜像迭代器。
Observable 是一个异步/推送的dual 同步/拉取的iterable。
Observables 不是固步自封的
ReactiveX并是不是基于某些特殊的并发、同步源。Observables 能够使用线程池、事件循环、非阻塞IO、actor,或者任何实现方式,只要它能够满足你的需求、你的风格、或者你的专业知识。前端代码将 Observables 能实现的交互都看做异步的,无论你的潜在实现是阻塞、非阻塞,你决定如何实现它。
Observables 如何实现?
public Observable<data> getData();
它是否和调用者一样在同一个线程中同步执行?
它是否在不同的线程上异步执行?
由于它将工作通过多线程进行拆分,是否会返回在任意顺序将数据返回给调用者?
他是否使用 Actor 而不是线程池?
他是否使用 NIO 和一个事件循环来处理异步网络请求?
他是否使用一个事件循环来将工作线程从回调线程中区分开来?
在 Observer 的角度看来,这些都无关紧要。
注意:通过 ReactiveX,你能更晚的改变你的想法,从根本上改变你的 Observables 的潜在自然实现,而不是将你的消费者从你的 Observable 上拆开。
Callbacks 有他们自身的问题
Callbacks 解决了为了不让任何事阻塞,提前阻塞了 Future.get() 的弊端。当回调开始,他们能够自然地执行。
但是对于 Futures 来说,当然,callbacks 在单一级别的异步执行上是可以方便使用的,但是在复杂嵌套式的组合上他们就变得不那么易用。
ReactiveX 是一个多元的实现方式
ReactiveX 现在实现了多种语言的支持,而且是基于各种语言自己的范式,同时,更多语言正在被加入进来。

Reactive 编程

ReactiveX 支持多种操作,你能够筛选、选择、转换、合并和组合 Observables。允许有效的执行和编写。
你能够将 Observables 类看做是一个类似于 iterable 的推送过程,但是是拉取。使用 iterable,消费者从生产者处拉取数据,这时线程中断了,直到这是数据正常返回。与此相反,通过 Observable ,当数据到达生产者,他就,第一时间将数据推到消费者手上。这种方式更加的可扩展,因为不用关心数据来自于异步还是同步消息。
以下例子展示了高阶函数可以被同时应用到 iterable 和 Obserable 上。
Observable 类型从 “the Gang of Four’s Observer pattern” 中新增了两个语义,来兼容 iterable 的类型:
1、没有更多数据的可用,生产的也能够发射信号给消费者的能力( iterable 的循环结束之后,也能够返回值,Observer 在 onCompleted 方法中返回值)
2、有错误产生的时候,生产的也能够发射信号给消费者的能力(如果循环中出现错误,iterable 抛出一个异常;Observable 调用监听者的 onError 方法)
通过这个增加点,ReactiveX 能够和谐的将 iterable 和 Observable 类型合并。唯一的不同就是数据流的方向。现在,任何你在 iterable 上能够执行的错做,你都能够在 Observable 上执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ReactiveX】介绍(译) 的相关文章

随机推荐

  • 停止开发GPT-4?我更加关注数据版权、信息安全和数字鸿沟问题

    近日 随着ChatGPT和GPT 4的迅猛发展 人工智能对于人类社会以及文明的影响将是我们需要重视的问题 有人认为ChatGPT的表现引人入胜 但同时也让人感到毛骨悚然 因此 AI是否可靠 是否会导致灾难 机器智能超过人类的 奇点 是否真正
  • 公共IPV6 dns大全

    dns是什么和公共ipv4可阅读本篇文章 dns大全 一 阿里ipv6 dns 阿里的dns好在于自家的服务器遍布全球 加上自家研究的CDN技术快稳定 强大的阿里云团队技术坚持也是国内首家支持IPv4和IPv6 双端加持 安全快速 2400
  • js数组常见操作方法总结

    0 将数组中所有name改成ChName Name改成EnName var arr1 name aa Name ss children name ww Name nn name ff Name ee let arr2 JSON parse
  • 过滤器 和 拦截器 的区别

    1 过滤器 Filter 过滤器配置比较简单 直接实现Filter 接口即可 也可以通过 WebFilter注解实现对特定URL拦截 看到Filter 接口中定义了三个方法 init 该方法在容器启动初始化过滤器时被调用 它在 Filter
  • matplotlib图表多曲线多纵轴绘制工具方法

    matplotlib是常用的可视化库 画折线图只要把列表plot进去就可以轻松展示 这里只弄折线图 其它图暂时不管 同一图上不同曲线数值大小差太多就能绘制成地板和天花板还不能给人家量纲去了 所以不同曲线需要不同纵轴才能清晰看出细小波动 要是
  • vscode代码上传到gitlab

    1 打开终端 1 1输入一下内容提交到本地仓库 PS D VueProject2 mall admin web gt git add PS D VueProject2 mall admin web gt git commit m 商品优化
  • PCB翘曲度

    为了正确放置 SMT 组件 PCB 必须保持完全平整 为了准确放置 贴片机必须将 SMT 组件释放到所有组件的电路板上方相同高度 如果 PCB 有翘曲 也就是说不平整 则机器在将元件放置在电路板上时 在释放元件时无法保持恒定的高度 这会影响
  • 德隆现象给中国企业的反思

    德隆现象给中国企业的反思 刘亚军 萨尼威投资管理顾问公司董事长兼首席咨询顾问 一 德隆 一个资本扩张神话的终结 最近 德隆继创造了自1992年进入快速成长以来 十二年形成了220亿的资产规模 在国内股市长期低迷的情况下 旗下的 老三股 屹立
  • Matlab数字图像处理--分别采用 5×5,9×9,15×15 和 25×25 大小的拉普拉斯算子对图像进行锐化滤波,并完成图像的锐化增强

    题目 代码 初始化 B为灰度图 B rgb2gary img i表示生成尺寸为i i的拉普拉斯算子 function init B i lap genlaplacian i img lap imfilter B lap replicate
  • 计算机协会管理,计算机爱好者协会内部管理制度

    计算机爱好者协会内部管理制度 由会员分享 可在线阅读 更多相关 计算机爱好者协会内部管理制度 5页珍藏版 请在人人文库网上搜索 1 计算机爱好者协会内部管理制度 1内部管理考核制度目录第一章总章 3 第二章组织工作制度 4 第三章普通会员权
  • Injection of autowired dependencies failed; 的解决办法!

    错误信息 严重 Exception sending context initialized event to listener instance of class org springframework web context Contex
  • 趣解面向对象

    小白自述 过去就听说 到面向对象的时候即使没有女朋友 都可以new好多个 啥时候我也能想new多少new多少 面向对象听了很多老师的课 感觉好绕啊 这个类套那个类 怎么套的也是一头雾水 怎么才能学好了面向对象嘛 好多人都说面向对象是java
  • 【Tensorflow2.0】8、tensorflow2.0_hdf5_savedmodel_pb模型转换[1]

    文章目录 1 训练模型 2 各种模型间互转并验证 2 1 hdf5转saved model 2 2 saved model转hdf5 2 3 所有模型精度测试 2 4 hdf5和saved模型转tensorflow1 x pb模型 2 5
  • Linux修改虚拟内存

    Linux机器默认swap空间 虚拟内存 为2G或更小 在运行一些大型程序如深度神经网络程序时 物理内存往往无法满足需求 可以扩大swap空间以达到正常运行的目的 主要分为6个步骤 1 创建swap文件夹 sudo mkdir usr sw
  • ospf小总结

    Ospf 开放式最短路径优先协议 Open Shortest Path First OSPF 无类别链路状态igp协议 周期更新 30min 触发更新 链路状态协议的更新量随着网络范围的扩展指数性的上升 因此ospf协议为了在中大型网络中工
  • 【cpolar、PHPStudy— 搭建企业论坛】

    公司内部搭建企业论坛 并实现在外也可以访问 文章目录 公司内部搭建企业论坛 并实现在外也可以访问 前言 1 cpolar PHPStudy 2 Discuz 3 打开PHPStudy 安装网页论坛所需软件 4 进行网页运行环境的构建 5 运
  • 关于ADMM的研究(二)

    4 Consensus and Sharing 本节讲述的两个优化问题 是非常常见的优化问题 也非常重要 我认为是ADMM算法通往并行和分布式计算的一个途径 consensus和sharing 即一致性优化问题与共享优化问题 Consens
  • Servlet的生命周期

    目录 1 Servlet的一生有这么几个阶段 2 一个Servlet从开始到消亡 1 Servlet的一生有这么几个阶段 调用构造方法进行实例化 1 构造方法 在第一次发起请求时 调用一次 public HomeServlet System
  • 61850协议服务器端开发,IEC61850中报告服务端开发

    实战的方式介绍IEC61850报告服务端的开发 本文讲述的是IEC61850中最常用的报告功能服务端的实现方法 内容包含了CID建模 编码实现 还包括后面的运行效果 MMS报文等 一 CID建模 1 通讯部分 1 1 9999 1 12 0
  • 【ReactiveX】介绍(译)

    更多内容 欢迎关注作者博客 http www china10s com blog p 465 ReactiveX 是通过使用 Observable 序列用来合成异步的和事件响应式的程序上的库文件 它扩展了通知者模式来支持数据和 或事件的响应