我一直在阅读GHC中的新IO管理器,它使用异步事件通知并避免阻塞I / O以实现高吞吐量。
哪些IO活动有资格通过新的异步IO代码进行管理?读写文件和网络活动?数据库访问?是否存在经理必须诉诸阻止的IO?
答案 0 :(得分:26)
任何可由epoll
/ kqueue
管理的文件描述符都符合条件。想要异步处理I / O的库需要通过
threadWaitRead
的系统调用之前,调用threadWaitWrite
中的GHC.Conc
和EWOULDBLOCK
函数。 Handle
和Socket
类型已经完成。如果您使用例如绑定到C数据库库会导致阻塞行为,因为该库不会与I / O管理器配合。
答案 1 :(得分:5)
一个令人满意的答案:
新GHC IO管理器的核心是kqueue()/epoll()
事件循环。因此,我希望可以在此基础上构建的任何内容都符合条件 - 如果不是现在,那么以后。特别是这意味着:
代码(几个月前我查看过,可能已经发生了变化)还支持通过优先级(搜索)队列注册和运行各种超时。这表明大多数sleep
- 类似的调用也可以在接口上捎带。
关于数据库访问:当然,您经常通过网络IO套接字访问数据库,因此调用forkIO
并在单独的线程中进行数据库访问应该是可行,快速和安全的。可以使用并发方法Chan
或STM.TChan
之一将数据传回给应用程序的其余部分。
我认为管理者不得不采用阻塞本身的IO,但我可以想象一些库可能绕过新的IO管理器并直接进入颈部。他们当然会阻止。