ZIO光纤和光纤数据类型介绍

169 阅读4分钟

在这篇博文中,我们将讨论ZIO中的纤维,以及它们与线程有什么不同。

简介

ZIO是一个由轻量级虚拟线程的纤维驱动的高并发框架。与线程相比,它们实现了巨大的可扩展性,并通过资源安全的取消来加强,它支持ZIO中的一些功能。

什么是纤维?

光纤是操作系统线程的轻量级等价物,代表一个正在进行的计算。单个光纤按顺序执行指令。一个JVM线程可以运行多个纤维。所以纤维与线程有多对一的关系。

ZIO中的纤维

在ZIO中,所有的效果都由一些纤维来执行。如果我们没有创建纤维,那么纤维是由我们正在使用的一些操作(如果该操作是并发的或并行的),或由ZIO运行时系统创建。

即使我们只是写 "单线程 "代码,没有并行或并发操作,至少会有一个纤维存在,即执行我们效果的 "主 "纤维。

每个纤维要么失败,要么成功,取决于它所执行的效果是成功还是失败。

与线程的相似性

ZIO纤维,就像操作系统级别的线程一样,有一个明确定义的寿命,这是由它们正在执行的效果决定的。

纤维也包含不同的身份、堆栈(包括堆栈跟踪)、本地状态和状态(如完成、运行或暂停)。

线程的局限性

与ZIO纤维相比,操作系统线程有一些限制:

  • 线程是稀缺的--JVM上的线程映射到操作系统上的线程,限制了我们在程序中可以拥有的线程数量。
  • 创建时成本高- 一般来说,线程的创建在时间和内存复杂性方面都是相当昂贵的。
  • 上下文切换的开销很大--从一个线程的执行切换到另一个线程的执行需要大量的时间。
  • 缺乏可组合性- 线程没有一个有意义的返回类型。所以它们不能以任何特定的值结束。另外,它们也没有错误的类型参数。

纤维的主要特点

ZIO纤维试图通过包括以下特征来解决线程限制:

  • 无界大小--纤维对线程的映射是多对一的,因此纤维在JVM上为我们提供了大量并发的轻量级绿色线程
  • 轻量级--纤维是相当轻量级的,因为它们是虚拟的,而且它们使用绿色线程
  • 异步性--线程总是同步的,而纤维总是异步的。这就是为什么纤维在扩展性方面优于线程的原因。
  • 类型化和可组合性--纤维有一个有意义的返回类型,允许我们编写更多类型安全的程序。纤维有类型化的错误(E)和成功值(A)作为其类型。
  • 结构化的并发- ZIO提供结构化的并发。子纤维的作用范围是他们的父纤维。这意味着,当父效应完成执行时,所有子效应将自动中断。因此,当我们分叉时,我们会得到一个纤维。该光纤的寿命与分叉它的父光纤绑定。几乎不可能泄露纤维,因为子纤维被保证在其父纤维之前完成。

纤维数据类型

ZIO中的Fiber 数据类型代表一个执行效果的 "句柄"。Fiber 数据类型与Scala的Future 数据类型最为相似,后者代表了一个运行中的异步计算的 "句柄"。

ZIO中的Fiber[E, A] 数据类型有两个类型参数:

  • E 失败类型: 对应于错误通道。它表示纤维可能失败的错误类型。E
  • A 成功类型: 对应于计算的成功值。这意味着光纤可以以A类型成功A

纤维没有R 类型,即环境参数,因为纤维只执行已经有要求提供给它的效果。

总结

在这篇博客中,我们讨论了ZIO纤维,它们的特点,以及它们与线程的相似性。我们还简单介绍了ZIO中的纤维数据类型。要阅读更多类似的博客,请点击这里