首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在WAI服务器中实现关闭命令?

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

Stack Overflow用户
提问于 2011-10-25 04:07:54
回答 1查看 1.4K关注 0票数 18

我想为我的webapp实现一个“优雅的关闭”命令(而不是我的第一个直觉,那就是要求人们终止进程)

我的前两次尝试包括

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

这两者都只是愉快地将结果返回给客户端,并继续侦听。应用程序能做什么来杀死服务器吗?这是想要做的合理的事情吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-17 13:59:34

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

正如其他人提到的,使用MVar可能是最好的选择。为了完整起见,我将其他部分包括在内,但它们确实有自己的位置。在基础库中使用了throwTo,我开发过一些使用C语言的exitImmediatelyexit()的应用程序,不过我还没有遇到过使用这种方法的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 
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7881327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档