在Haskell中实现主服务器循环?

时间:2012-09-13 19:08:11

标签: haskell

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

  • 新套接字连接
  • 现有套接字上的可用数据
  • OS信号
  • 第三方库回调

4 个答案:

答案 0 :(得分:6)

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

您可以设法在Haskell中编写类似的内容,但Haskell还有更多内容可供选择:

我建议您为与外界的每个单独联系点分叉一个新线程,并保持所有内容与STM协调。

答案 1 :(得分:2)

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

答案 2 :(得分: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) = ....

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

答案 3 :(得分:0)

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

但是,根据事物的外观,在你的情况下,你可能只想为每个任务生成一个单独的Haskell线程,并让每个这样的线程阻塞,而没有任何事情发生。

你不想创建一千个OS线程,但是一千个Haskell线程都没有问题。

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