对于管道(使用make-pipe
创建),可以从关联的输入端口读取写入输出端口的任何数据。
通道类似,但有一个主要区别:向输入块写入内容,直到同时读取输出。这对于并发特别有用,因为它可用于线程间通信和同步。
球拍也有asynchronous channels的概念。这些类似于普通通道,但另外还有一个缓冲区。如果数据写入缓冲区且未满,则写入线程继续。如果队列为空,则读取线程将阻塞,否则它将读取最新数据并继续。
问题是,管道和异步通道之间有什么区别?显然,异步通道是在考虑线程的情况下创建的,而管道则独立于线程。但这两种API似乎都有着相同的目的:
两者之间的主要区别似乎在于每个项目中的项目。管道似乎主要用于处理文本(和字节),并相应地设置它们的大小。通道处理放置在队列中的项目,而不是这些项目本身的大小。
例如,缓冲区大小“2”可以包含一个包含2个字节的字符串,而缓冲区大小为“2”的异步通道可以容纳2个项目,不管这些项目是多少。
这将导致人们认为管道可能仅用于文本,其中通道更通用。但是,非文本项仍然可以写入管道,如make-pipe-with-specials
所示。
那么,异步通道和管道之间的不同用途是什么?