簡體   English   中英

在Haskell中實現主服務器循環?

[英]Implement main server loop in Haskell?

實現需要等待異構事件集的服務器主循環的普遍接受的方法是什么? 這是服務器應該等待(不忙等),直到出現以下情況之一:

  • 新的套接字連接
  • 現有套接字上可用的數據
  • OS信號
  • 第三方庫回調

我認為你正在考慮使用單線程,非阻塞I / O和select()調用的C范例。

您可以設法在Haskell中編寫類似的東西,但Haskell還提供了更多功能:

我建議您為與外界的每個單獨的聯系點分叉一個新線程,並保持與STM協調的所有內容。

使用takeMVarputMVar在線程之間進行同步。 如果不允許操作,它們通常會阻塞線程。 閱讀ghc文檔

我想說清楚一點,我認為首先發布的兩個解決方案對於你遇到的具體問題比這個更好,但是這里有一種方法可以解決你提出的問題類型。

一個簡單的方法就是采用你的定義

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) = ....

就像我說的,閱讀其他答案!

軟件事務內存(STM)是進行多向等待的主要方式。

但是,根據事物的外觀,在您的情況下,您可能只想為每個任務生成一個單獨的Haskell線程,並讓每個這樣的線程阻塞,而沒有任何事情發生。

你不會想要創建一千個操作系統線程,但是一千個Haskell線程都沒有問題。

(如果這些線程需要不時地協調,那么STM可能是最簡單,最可靠的方法。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM