此时,您尝试查看程序中将处理哪些不同的流(或可观察对象)。但流动有两种类型:热流和冷流。理解差异是成功使用反应式编程的关键。
冷可观察对象是懒惰的。除非有人开始观看 它们( 在 RX 上订阅),否则它们不会做任何事情 。只有当它们被消耗后,它们才会开始行走。冷流用于表示异步操作,例如,直到有人对结果感兴趣时才会执行。另一个例子是文件下载。如果没有人对数据进行任何操作,它就不会开始提取字节。冷流生成的数据不会在订阅者之间共享,当您订阅时,您会获得所有项目。
订阅前活跃的热门流,例如股票行情数据,或传感器或用户发送的数据。数据独 德国电报号码数据 立于个别客户。当观察者订阅一个热的可观察对象时,它将获得 订阅后发射的流中的所有值 。价值由所有客户共享。例如,即使没有人订阅温度计,温度计也会测量并发布当前温度。当客户注册一个流时,他们会自动收到下一个尺寸。
为什么了解流量是热的还是冷的如此重要?因为它改变了代码使用传递的项目的方式。如果您没有订阅热门可观察对象,您将不会收到数据,并且该数据将丢失。
异步咬合
响应式编程的定义中有一个重要的词 :异步。当数据在流中异步发出时,您会收到通知 - 这意味着独立于主程序流。通过围绕数据流构建程序,您可以编写异步代码:编写在流发出新项目时调用的代码。在这种情况下,线程、阻塞代码和副作用非常重要。让我们先从副作用开始。
没有副作用的函数仅通过其参数和返回值与程序的其余部分进行交互。副作用可能非常有用,但在很多情况下是不可避免的。但它们也存在缺陷。使用反应式编程时,应避免不必要的副作用,并在使用时有明确的意图。因此,拥抱永恒和无副作用的功能。虽然有些情况是合理的,但副作用的误用会导致雷暴:线程安全。
这是第二个重点:线索。观察流程并在发生有趣的事情时得到通知很有趣,但你不应该忘记是谁调用了你,或者更准确地说,你的函数在哪个线程上运行。强烈建议避免在程序中使用过多的线程。依赖多线程的异步程序会成为困难的同步难题,最终往往导致死锁。
这就是第三点:永不阻塞。由于您不拥有调用您的线程,因此您应该确保永远不会阻止它们。如果这样做,您可以避免发出其他项目,它们将被缓冲,直到...缓冲区已满(在这种情况下可能会出现背压,但这不是本文的主题)。通过结合 RX 和异步 IO,您可以获得编写非阻塞代码所需的一切,如果您想要更多,请查看 Eclipse Vert.x,这是一个结合了反应性和异步的反应式工具包。