Concurrency Racket中的管道与异步通道

Concurrency Racket中的管道与异步通道,concurrency,racket,channel,Concurrency,Racket,Channel,球拍有和的概念 对于管道(使用make pipe创建),可以从相关的输入端口读取写入输出端口的任何数据 通道是相似的,但有一个主要区别:向输入块写入内容,直到同时读取输出。这对于并发尤其有用,因为它可以用于线程间通信和同步 球拍也有一个概念。这些通道类似于普通通道,但另外有一个缓冲区。如果数据被写入缓冲区,但未满,则写入线程将继续。如果队列为空,则读取线程将阻塞,否则它可以读取最新数据并继续 问题是,管道和异步通道之间有什么区别?显然,异步通道是在考虑线程的情况下创建的,而管道是独立于线程的。但

球拍有和的概念

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

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

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

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

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

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

    这可能会让人想到,管道可能只用于文本,因为在文本中,通道更为通用。但是,非文本项仍然可以写入管道,如所示

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