【问题标题】:How to implement asynchronous reading in go?go中如何实现异步读取?
【发布时间】: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,这将使用适当的操作系统内核通知系统,例如epollkqueueselectpoll 或在 Windows 上使用 IO Completion Port。我会想象 Go 会做类似的事情。

标签: asynchronous go


【解决方案1】:

Go 还没有对文件 I/O 使用任何特殊的东西。它只是创建一个新线程(因此总是有 GOMAXPROCS 线程可用于 goroutines)并阻塞操作。我想在邮件列表上已经有一些关于使用 AIO 的讨论,但是当时有很多问题。 golang-nuts mailing list 可能是解决这类问题的更好地方。

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多