Go语言为何不使用异步文件IO和PoolDesc

可以参考这两个thread:之前的讨论: os: "async" file IO · Issue #6817 · golang/go最近的proposal: proposal: "os/poll" package for exposing the runtime poller for generic file descriptors · Issue #18507 · golang/go
■网友
对于sockets,可读状态意味着接收缓冲区中有一些未读数据。这是NIO的最常见用例。可写状态则意味着从套接字的底层协议(例如TCP/IP)的角度来看,发送缓冲区不是满的。协议特定的拥塞控制机制确定了发送缓冲区的机制和策略。而一般文件始终可读,并且始终可写。这在相关的POSIX规范中有明确说明。将一般文件置于非阻塞状态除了更改文件标志中的一位标志之外,没有任何影响。从一般文件中读取可能需要很长时间。例如,如果在繁忙磁盘上对一般文件进行io操作,则io调度可能需要花很长的时间才能完成。但是检查文件的可读性或可写性总是会立即成功。如果系统需要时间来执行io操作,它还是会使任务处于读取或写入系统调用的non-interruptible sleep状态。上面说了对于一般文件,尝试NIO是没有任何用处的,但是还是有aio这样的解决方案可以尝试,这是github上大家对go实现普通io异步化的讨论,这个issue到目前为止还是open的状态,大家的讨论里面最主要的观点就是linux虽然支持aio,但是aio有很多限制和缺陷,所以目前还没有办法通过aio把普通文件的io操作像socket一样直接挂在一个netpoller上。但是windows下的IOCP机制就可以,所以windows下的go进行普通io操作也是不会block线程的。
参考文献:
https://0xmurmur.world/post/go_async_file_io/

■网友
linux下有两种aio支持,其一就是glibc,是通过线程来实现的,其二是libaio,底层支持,两种都不是很好,glibc的线程,倒不如自己写线程池读文件,libaio打开文件需要加标示O_DIRECT标识,很多限制和诟病。
所以,golang在linux下暂时没有做异步读写文件的实现。
【Go语言为何不使用异步文件IO和PoolDesc】 顺带一提,windows iocp支持文件呐。


    推荐阅读