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支持文件呐。
推荐阅读
- 『先进』长江流域最先进洗舱站在宁投运 油可分离回收,水能循环使用
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- OC为何跌出语言榜前十
- 汽车|迈凯伦Artura不再使用迈凯伦祖传V8引擎了?
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 人民车市|新语言、新起点,捷达VS7 强势入局
- python的html5lib这个库咋使用啊我在网上也没有找到相关文档
- C语言 指针引用数组的地址问题
- win7中本地连接跟无线网卡同时使用时是怎么样的模式
- 可不可能利用网盘的秒传功能使用伪造的MD5(或其他信息)值进行文件分享
