TQueue

TQueue[A] 是一个可以参与 STM 事务的可变队列。

创建一个 TQueue

创建一个具有指定容量的空的有界 TQueue

import zio._
import zio.stm._

val tQueueBounded: STM[Nothing, TQueue[Int]] = TQueue.bounded[Int](5)

创建一个空的无容量限制的 TQueue

import zio._
import zio.stm._

val tQueueUnbounded: STM[Nothing, TQueue[Int]] = TQueue.unbounded[Int]

将元素加入一个 TQueue

将元素放入一个 TQueue:

import zio._
import zio.stm._

val tQueueOffer: UIO[TQueue[Int]] = (for {
  tQueue <- TQueue.bounded[Int](3)
  _      <- tQueue.offer(1)
} yield tQueue).commit

如果队列未满,则指定的元素将被成功添加到队列中。否则,它将等待队列中的空插槽位。

另外,您可以使用一个元素列表来填充队列:

import zio._
import zio.stm._

val tQueueOfferAll: UIO[TQueue[Int]] = (for {
  tQueue <- TQueue.bounded[Int](3)
  _      <- tQueue.offerAll(List(1, 2))
} yield tQueue).commit

从 TQueue 中取回元素

您可以从队列中取回第一个元素,如下例:

import zio._
import zio.stm._

val tQueueTake: UIO[Int] = (for {
  tQueue <- TQueue.bounded[Int](3)
  _      <- tQueue.offerAll(List(1, 2))
  res    <- tQueue.take
} yield res).commit

如果队列为空,它将阻塞等待您所期待的元素。

可以通过使用 poll 方法来避免此阻塞行为,该方法将返回一个元素(如果存在)否则返回 None:

import zio._
import zio.stm._

val tQueuePoll: UIO[Option[Int]] = (for {
  tQueue <- TQueue.bounded[Int](3)
  res    <- tQueue.poll
} yield res).commit

取回队列的前n个元素:

import zio._
import zio.stm._

val tQueueTakeUpTo: UIO[List[Int]] = (for {
  tQueue <- TQueue.bounded[Int](4)
  _      <- tQueue.offerAll(List(1, 2))
  res    <- tQueue.takeUpTo(3)
} yield res).commit

可以按以下方式获取队列的所有元素:

import zio._
import zio.stm._

val tQueueTakeAll: UIO[List[Int]] = (for {
  tQueue <- TQueue.bounded[Int](4)
  _      <- tQueue.offerAll(List(1, 2))
  res    <- tQueue.takeAll
} yield res).commit

TQueue 的大小

可以按以下方式获取队列中元素的个数:

import zio._
import zio.stm._

val tQueueSize: UIO[Int] = (for {
  tQueue <- TQueue.bounded[Int](3)
  _      <- tQueue.offerAll(List(1, 2))
  size   <- tQueue.size
} yield size).commit
Leave a Reply
Your email address will not be published.
*
*

BACK TO TOP