Concurrency IO通道与读写器

Concurrency IO通道与读写器,concurrency,io,go,channel,Concurrency,Io,Go,Channel,既然Go有通道,我就想知道为什么标准库似乎没有设计成将它们也用于IO 有读写器类型,但使用频道会有什么问题 一个函数可以返回一个字节片通道(假设单字节,甚至单位返回效率太低),并接收一个用于取消请求的通道和一个用于错误报告的通道 -好奇的新手。频道非常适合在Goroutine之间进行交流。当一个程序做一些简单的事情时,比如读取stdin,对流做一些事情,并将结果输出到stdout,那么使用一个通道是一种过激的行为,不必要地损害了性能 只要标准库在某些地方没有为相互通信的goroutine提供特定

既然Go有通道,我就想知道为什么标准库似乎没有设计成将它们也用于IO

有读写器类型,但使用频道会有什么问题

一个函数可以返回一个字节片通道(假设单字节,甚至单位返回效率太低),并接收一个用于取消请求的通道和一个用于错误报告的通道


-好奇的新手。

频道非常适合在Goroutine之间进行交流。当一个程序做一些简单的事情时,比如读取stdin,对流做一些事情,并将结果输出到stdout,那么使用一个通道是一种过激的行为,不必要地损害了性能

只要标准库在某些地方没有为相互通信的goroutine提供特定的内容,就没有很好的理由对简单操作进行建模,例如使用通道的
io.Reader
io.Writer
的操作,它们各自都有一个基于通道的方法集(API)


此外,如果需要,可以将简单实现包装在通道中,而相反,将通道实现“展开”回其原语是不可能的。此外,Go作者显然喜欢明确性,这导致性能瓶颈没有被隐藏(而且令人惊讶)。

我认为另一个原因是
io.Reader
io.Writer
存在,因为它们在单线程级别上表现良好;通道几乎完全用于内部goroutine通信或多线程模型。在某些情况下,您可能可以互换使用它们,但它们旨在解决两个不同的挑战。
io.Reader
io.Writer
也有EOF的概念,它不能很容易地通过通道复制,除非在通道上分层一个单独的协议-这当然是一种过分的做法。
另外,关闭通道与EOF也不一样,因为关闭通道会阻止将来使用它。

我的这个软件包实现了将io.Reader和io.Writer包装到通道中

或者,换句话说,它创建了一个线程安全的缓冲区

或者,换句话说,它是一个通用管道


所以我想你的观点有两个:1)在这种情况下,通道将成为性能瓶颈,2)通道将隐藏IO,设计者不喜欢这样。对读写器与通道进行性能测量,以了解实际的性能损失是什么,这将是一件有趣的事情——当然要意识到编译器可以针对简单的情况进行优化,并且随着时间的推移,优化将变得更加复杂。Rob Pike谈到了渠道的性能优化机会。