GHC IO管理器支持哪些IO活动?

Bil*_*ill 32 haskell ghc

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

哪些IO活动有资格通过新的异步IO代码进行管理?读写文件和网络活动?数据库访问?是否存在经理不得不诉诸阻止的IO?

tib*_*bbe 26

可以由epoll/ 管理的任何文件描述符kqueue都是合格的.想要异步处理I/O的库需要与I/O管理器合作

  • 使文件描述符无阻塞,和
  • 在重试先前返回的系统调用之前调用threadWaitReadthreadWaitWrite函数.GHC.ConcEWOULDBLOCK

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

  • 我可以注意到`tibbe`可能是这个领域的*知道人:) (8认同)

I G*_*ERS 5

一个有点满意的答案:

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

  • 文件IO
  • 网络IO

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

数据库访问:当然,你经常通过网络IO插槽访问数据库,以便调用forkIO,并在一个单独的线程执行DB访问应该是可行的,快速和安全.可以使用并发方法之一将数据传回给应用程序的其余部分,Chan或者STM.TChan.

我认为管理者不得不求助于阻塞本身,但我可以想象一些库可以绕过新的IO管理器并直接进入颈部.他们当然会阻止.