我该如何在Haskell中观察多个文件/套接字并等待其可读/可写?
Haskell中是否有类似select / epoll / ... 的功能?或者我必须为每个文件/套接字生成一个线程,并始终在该线程内使用阻塞资源?
我该如何在Haskell中观察多个文件/套接字并等待其可读/可写?
Haskell中是否有类似select / epoll / ... 的功能?或者我必须为每个文件/套接字生成一个线程,并始终在该线程内使用阻塞资源?
有一个 select(2)
的包装器:https://hackage.haskell.org/package/select。
这里有一个使用示例:https://github.com/pxqr/udev/blob/master/examples/monitor.hs#L36
还有一个 poll(2)
的包装器:https://hackage.haskell.org/package/poll
GHC base 中包含了在 Linux 上(以及其他平台上)封装 epoll 的功能,位于 GHC.Event
模块中。
这里有一个使用示例:
import GHC.Event
import Data.Maybe (fromMaybe)
import Control.Concurrent (threadDelay)
main = do
fd <- getSomeFileDescriptorOfInterest
mgr <- fromMaybe (error "Must be compiled with -threaded") <$> getSystemEventManager
registerFd mgr (\fdkey event -> print event) fd evtRead OneShot
threadDelay 100000000
loop
已被移至隐藏模块GHC.Event.Manager
,并且我无法确定它是否公开导出。而GHC.Event
本身表示:“此模块应视为GHC内部模块。”。Control.Concurrent
中有threadWaitRead
和threadWaitWrite
。因此,要翻译上面的epoll示例:import Control.Concurrent (threadWaitRead)
main = do
fd <- getSomeFileDescriptorOfInterest
threadWaitRead fd
putStrLn "Got a read ready event"
Control.Monad.forever
将threadWaitRead
和随后的IO操作包装起来,以便重复执行它们。你还可以使用forkIO
将其包装在后台运行,而不妨碍程序做其他事情。Control.Concurrent
中有 threadWaitRead
和 threadWaitWrite
,可以阻塞当前线程直到文件描述符准备好读取/写入,而不实际进行读取或写入。 - pdxleifControl.Concurrent.threadWaitRead
- 这已经是 GHC 的一部分,应该是跨平台的。我不建议使用那个 select
库。 - pdxleif
hGetChar
或hPutChar
。 - Daniel WagnerControl.Concurrent
里有threadWaitRead
和threadWaitWrite
,可以阻塞当前线程,直到文件描述符准备好读取/写入,而不实际进行读取或写入。 - pdxleif