haskell - 如何在 WAI 服务器中实现关闭命令?

标签 haskell yesod

我想为我的 web 应用程序实现一个“正常关闭”命令(与我的第一直觉相反,即要求人们终止该进程)

我的前两次尝试包括

  • liftIO exitSuccess
  • E.yield (responseLBS statusOK [G.contentType "text/plain"] "") E.EOF

  • 两者都只是兴高采烈地向客户返回结果并继续收听。应用程序有什么可以杀死服务器的吗?这甚至是一件合理的事情吗?

    我承认我对 iteratee 的理解不是很深,只知道我可以使用我的输入并且 Iteratee 是一个 MonadIO 实例。

    最佳答案

  • 使用 MVar。阻塞主线程直到 MVar 发出信号,然后清理并退出。
  • 调用 exitImmediately .拆除该过程的最快方法之一,而且调试起来也非常烦人。我不相信终结器/括号/finally block 会在下降的过程中被调用,这取决于您的应用程序,它可能会损坏状态。
  • 向主线程抛出异常。 Warp.run不捕获异常,因此这通过允许主线程(和仅主线程)上的默认异常处理程序终止进程来工作。

  • 正如其他人所提到的,使用 MVar 可能是最好的选择。为了完整起见,我包括了其他人,但他们确实有自己的位置。 throwTo在基本库中使用了一些,我已经处理了一些使用 C 等效的 exitImmediately 的应用程序。 : exit() ,虽然我没有遇到任何使用这种方法的 Haskell 应用程序。
    {-# LANGUAGE DeriveDataTypeable #-}
    {-# LANGUAGE OverloadedStrings #-}
    
    module Main (main) where
    
    import Control.Concurrent (MVar, ThreadId, forkIO, myThreadId, newEmptyMVar, putMVar, takeMVar)
    import Control.Exception (Exception, throwTo)
    import Control.Monad.Trans (liftIO)
    import Data.ByteString (ByteString)
    import Data.Data (Data, Typeable)
    import Data.Enumerator (Iteratee)
    import Network.HTTP.Types
    import Network.Wai as Wai
    import Network.Wai.Handler.Warp as Warp
    import System.Exit (ExitCode (ExitSuccess))
    import System.Posix.Process (exitImmediately)
    
    data Shutdown = Shutdown deriving (Data, Typeable, Show)
    instance Exception Shutdown
    
    app :: ThreadId -> MVar () -> Request -> Iteratee ByteString IO Response
    app mainThread shutdownMVar Request{pathInfo = pathInfo} = do
      liftIO $ case pathInfo of
        ["shutdownByThrowing"] -> throwTo mainThread Shutdown
        ["shutdownByMVar"]     -> putMVar shutdownMVar ()
        ["shutdownByExit"]     -> exitImmediately ExitSuccess
        _                      -> return ()
      return $ responseLBS statusOK [headerContentType "text/plain"] "ok"
    
    main :: IO ()
    main = do
      mainThread <- myThreadId
      shutdownMVar <- newEmptyMVar
      forkIO $ Warp.run 3000 (app mainThread shutdownMVar)
      takeMVar shutdownMVar 
    

    关于haskell - 如何在 WAI 服务器中实现关闭命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7881327/

    相关文章:

    function - 如何用任意数量的函数组成 `not`?

    Haskell llvm-general JIT : calling a C function on the fly. Stephen Diehl 的教程

    haskell - 带有 Keter 和 Cloudflare 的免费 SSL 的 Yesod 网络应用程序

    haskell - 需要配置数据的类型类实例。我有什么选择?

    haskell - 使用 esqueleto 计算行数

    javascript - Yesod:维护 JavaScript 和 Julius 文件的顺序

    haskell - Cabal 无法确定 GHC 版本

    haskell - Maybe 定义中的 <$

    haskell - 为什么 Haskell 中没有 Nums Ords?

    haskell - yesod - 获取 POST "Content-type: application/json"的请求正文