31

我一直在阅读 GHC 中的新 IO 管理器,它使用异步事件通知并避免阻塞 I/O 来实现高吞吐量。

哪些 IO 活动有资格由新的异步 IO 代码管理?读写文件和网络活动?数据库访问?是否存在经理必须诉诸阻塞的 IO?

4

2 回答 2

26

epoll任何可以由/管理的文件描述符kqueue都符合条件。想要异步处理 I/O 的库需要通过以下方式与 I/O 管理器合作

  • 使文件描述符成为非阻塞的,并且
  • 在重试之前返回的系统调用之前调用threadWaitReadandthreadWaitWrite函数。GHC.ConcEWOULDBLOCK

HandleSocket类型已经这样做了。如果您使用例如绑定到 C 数据库库,您将获得阻塞行为,因为该库不会与 I/O 管理器合作。

于 2010-12-16T07:55:24.940 回答
5

一个比较满意的答案:

新 GHC IO 管理器的核心是kqueue()/epoll()事件循环。因此,我希望可以在此基础上构建的任何内容都符合条件——如果不是现在,那么以后。这尤其意味着:

  • 文件 IO
  • 网络 IO

该代码(几个月前我看过它,情况可能已经改变)还包含对通过优先级(搜索)队列注册和运行各种超时的支持。这表明大多数sleep类似的调用也可以搭载在接口上。

关于数据库访问:当然,您经常通过网络 IO 套接字访问数据库,因此forkIO在单独的线程中调用和执行数据库访问应该是可行的、快速的和安全的。可以使用其中一种并发方式ChanSTM.TChan.

我不认为管理器必须求助于阻塞本身的各种 IO,但我可以想象一些库可能会绕过新的 IO 管理器并直接进入颈静脉。他们当然会阻止。

于 2010-12-15T15:08:01.383 回答