当前位置:  开发笔记 > 运维 > 正文

为什么haskell的网络库使用非阻塞套接字?

如何解决《为什么haskell的网络库使用非阻塞套接字?》经验,为你挑选了1个好方法。

我正在努力更好地理解网络库中的设计决策.信誉良好的来源在github问题和使用非阻塞套接字的邮件列表响应中提及network.他们使用select来阻止,直到套接字准备好被读取,而不是使用默认的阻塞行为.为什么这样更好?无论哪种方式,它最终都会阻塞,并且network只向最终用户公开阻止API.我的猜测是,阻止FFI调用是不好的,并且存在某种GHC魔法select,但我无法证实这一点.

作为未成年人之外,我找不到地方select在叫network.打顶代码库没有出现任何问题.我刚刚发现了GHC.Event,它似乎提供了可以用来代替select直接调用的函数,但是grepping shownetwork也没有使用它.



1> bennofs..:

非阻塞IO事件循环是GHC运行时系统(RTS)的一部分.这与GHC的绿色线程系统非常好地交互:不是编写异步代码,而是使用轻量级线程,运行时将负责唤醒正确的线程.

默认情况下,Haskell中的所有IO都是非阻塞的,所以如果你有两个线程在不同的套接字上被阻塞,那么运行时系统将在内部执行select(或者某些其他特定于平台的方式来等待多个文件描述符)喜欢epollkqueue)只在文件描述符准备就绪时唤醒线程.有关详细信息,请参阅https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/IOManager.


它可能是它在linux上实际使用`epoll`,我相信情况就是如此.@sapanoia请参阅http://stackoverflow.com/a/39106000/2494803
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有