我一直在阅读 GHC 中的新 IO 管理器,它使用异步事件通知并避免阻塞 I/O 来实现高吞吐量。
哪些 IO 活动有资格由新的异步 IO 代码管理?读写文件和网络活动?数据库访问?是否存在经理必须诉诸阻塞的 IO?
epoll
任何可以由/管理的文件描述符kqueue
都符合条件。想要异步处理 I/O 的库需要通过以下方式与 I/O 管理器合作
threadWaitRead
andthreadWaitWrite
函数。GHC.Conc
EWOULDBLOCK
Handle
和Socket
类型已经这样做了。如果您使用例如绑定到 C 数据库库,您将获得阻塞行为,因为该库不会与 I/O 管理器合作。
一个比较满意的答案:
新 GHC IO 管理器的核心是kqueue()/epoll()
事件循环。因此,我希望可以在此基础上构建的任何内容都符合条件——如果不是现在,那么以后。这尤其意味着:
该代码(几个月前我看过它,情况可能已经改变)还包含对通过优先级(搜索)队列注册和运行各种超时的支持。这表明大多数sleep
类似的调用也可以搭载在接口上。
关于数据库访问:当然,您经常通过网络 IO 套接字访问数据库,因此forkIO
在单独的线程中调用和执行数据库访问应该是可行的、快速的和安全的。可以使用其中一种并发方式Chan
或STM.TChan
.
我不认为管理器必须求助于阻塞本身的各种 IO,但我可以想象一些库可能会绕过新的 IO 管理器并直接进入颈静脉。他们当然会阻止。