【发布时间】:2014-09-30 04:10:12
【问题描述】:
我在 linux 学习 golang 调度程序。我认为 golang 使用多线程来实现 goroutine ,当某个 goroutine 在 I/O 中被阻塞(就像读取文件一样)时,其他线程继续处理另一个 goroutine 。但是当有很多 I/O 时,我认为线程是不够的,golang 是如何处理的?
我读过一篇文章http://morsmachine.dk/netpoller,它说“Go 通过使用操作系统提供的异步接口解决了这个问题,但阻塞了执行 I/O 的 goroutines。” . 它像 aio_read 吗?据说异步接口有很多bug。而且我没有在源代码中找到它,或者我只是想念它。
据我所知,我知道我们可以使用 epoll 对管道和套接字进行异步 io,但是 epoll 不能用于读取或写入常规文件。而 nodejs 使用 libeio 为常规文件执行此操作。我想知道 golang 在运行时是如何做到的。
【问题讨论】:
-
目前,Go 使用线程读取文件来处理这个问题。我已经读到在 Go 1.4 中这个问题将得到妥善解决。
-
Node.js 现在实际上使用 libuv,这将使用适当的操作系统内核通知系统,例如
epoll、kqueue、select、poll或在 Windows 上使用IO Completion Port。我会想象 Go 会做类似的事情。
标签: asynchronous go