管道中的管道与异步通道

时间:2017-06-30 18:51:14

标签: concurrency racket channel

球拍的概念为pipeschannels

对于管道(使用make-pipe创建),可以从关联的输入端口读取写入输出端口的任何数据。

通道类似,但有一个主要区别:向输入块写入内容,直到同时读取输出。这对于并发特别有用,因为它可用于线程间通信和同步。

球拍也有asynchronous channels的概念。这些类似于普通通道,但另外还有一个缓冲区。如果数据写入缓冲区且未满,则写入线程继续。如果队列为空,则读取线程将阻塞,否则它将读取最新数据并继续。

问题是,管道和异步通道之间有什么区别?显然,异步通道是在考虑线程的情况下创建的,而管道则独立于线程。但这两种API似乎都有着相同的目的:

  1. 提供(可能是无限的)缓冲区,其中一些生产者可以输入。
  2. 为某些消费者提供输出以获取缓冲区中的数据。
  3. 允许消费者等待数据可用。
  4. 允许制作人放置输入并继续执行。
  5. 两者之间的主要区别似乎在于每个项目中的项目。管道似乎主要用于处理文本(和字节),并相应地设置它们的大小。通道处理放置在队列中的项目,而不是这些项目本身的大小。

    例如,缓冲区大小“2”可以包含一个包含2个字节的字符串,而缓冲区大小为“2”的异步通道可以容纳2个项目,不管这些项目是多少。

    这将导致人们认为管道可能仅用于文本,其中通道更通用。但是,非文本项仍然可以写入管道,如make-pipe-with-specials所示。

    那么,异步通道和管道之间的不同用途是什么?

0 个答案:

没有答案