[英]Implement main server loop in Haskell?
實現需要等待異構事件集的服務器主循環的普遍接受的方法是什么? 這是服務器應該等待(不忙等),直到出現以下情況之一:
使用takeMVar
和putMVar
在線程之間進行同步。 如果不允許操作,它們通常會阻塞線程。 閱讀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.