shajara流程图解有界 channel
中文

有界 channel

有界 channel 的容量会在接收方落后时让发送方等待。

spawn(writeBatches)send enters channelreceive takes valuequeueBatchespendingbatchQueue0/1writeBatchespending
function* queueBatches() {
  const [receiver, sender] = yield* channel<string, never>(1);

  yield* spawn(function* writeBatches() {
    const first = yield* receive(receiver);
    yield* sleep(1000);
    const second = yield* receive(receiver);
    const third = yield* receive(receiver);
    const fourth = yield* receive(receiver);
    return [first, second, third, fourth];
  });

  yield* send(sender, "draft");
  yield* send(sender, "review");
  yield* send(sender, "publish");
  yield* sleep(1000);
  yield* send(sender, "archive");

  return 4;
}
queueBatches 创建容量为一的 channel,并把 receiver 交给 writeBatches。
draft 这次 send 会在 channel 填满前被接受。
review 和 publish 到达时缓冲已满,所以这两次 send 会等待。
writeBatches 后续接收值时,等待中的 send 会被接受。