5

实现需要等待异构事件集的服务器的主循环的普遍接受的方法是什么?那就是服务器应该等待(而不是忙等待),直到发生以下情况之一:

  • 新的套接字连接
  • 现有套接字上可用的数据
  • 操作系统信号
  • 第三方库回调
4

4 回答 4

6

我认为您正在考虑具有单线程、非阻塞 I/O 和 select() 调用的 C 范例。

你可以设法在 Haskell 中编写类似的东西,但 Haskell 还提供更多功能:

我建议您为与外界的每个单独的接触点创建一个新线程,并保持一切与 STM 协调。

于 2012-09-13T19:43:48.910 回答
2

使用takeMVarandputMVar在线程之间进行同步。如果不允许操作,它们通常会阻塞线程。阅读ghc 文档

于 2012-09-13T19:17:17.670 回答
1

我想澄清一下,对于您遇到的特定问题,我认为首先发布的两个解决方案比这个更好,但这是解决您提出的问题类型的一种方法。

一个简单的方法是让你的定义像

data SocketConn = ....
data DataAvail = ...
data OSSignal = ...
data Callback = ...

并定义的未简化版本

data ServerEvent = Sok SocketConn | Dat DataAvail | Sig OSSignal | Call Callback

handleEvent :: ServerEvent -> IO ()
handleEvent (Soc s) = ....
handleEvent (Dat d) = ....
handleEvent (Sig o) = ....
handleEvent (Call c) = ....

就像我说的,阅读其他答案!

于 2012-09-14T02:43:45.707 回答
0

软件事务内存 (STM) 是进行多路等待的主要方式。

但是,从外观上看,在您的情况下,您可能只想为每个任务生成一个单独的 Haskell 线程,并让每个这样的线程在没有任何事情发生时阻塞。

你不会想创建一千个操作系统线程,但是一千个 Haskell 线程一点也不麻烦。

(如果这些线程需要不时协调,那么再次,STM 可能是最简单、最可靠的方法。)

于 2012-09-14T16:19:19.793 回答