如何在 WAI 服务器中执行关闭命令?

2024-04-10

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

我的前两次尝试包括

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

两者都只是愉快地将结果返回给客户并继续倾听。应用程序可以做些什么来杀死服务器吗?这是否是一件合理的事情呢?

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


  1. 使用MVar。阻塞主线程,直到 MVar 收到信号,然后清理并退出。
  2. Call exitImmediately。拆除进程的最快方法之一,而且调试起来也非常烦人。我不相信终结器/括号/finally 块会在下行过程中被调用,这取决于您的应用程序,它可能会损坏状态。
  3. 向主线程抛出异常。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 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WAI 服务器中执行关闭命令? 的相关文章

  • 如何在 Windows 7 中配置 cabal?

    我已经在Windows 7中安装了Haskell Platform 2012 我在控制台中编写cabal update我收到消息说有新版本的阴谋集团 我写的cabal install cabal install 安装完成后 它告诉我 cab
  • unsafeInterleaveIO 什么时候不安全?

    与其他不安全 操作不同 文档 http hackage haskell org packages archive base latest doc html System IO Unsafe html v unsafeInterleaveIO
  • Haskell 中的异构多态性(正确方法)

    让一个模块来抽象Area操作 错误的定义 class Area someShapeType where area someShapeType gt Float module utilities sumAreas Area someShape
  • 让 GHC 生成“带进位加法 (ADC)”指令

    下面的代码将表示 192 位数字的两个未装箱字三元组添加到新的未装箱字三元组中 并且还返回任何溢出 LANGUAGE MagicHash LANGUAGE UnboxedTuples import GHC Prim plusWord2 Wo
  • 使用 cabal new-install 重新安装相同版本的软件包

    我正在开发 Haskell 包 我还没有上传到Hackage 版本号是0 1 0 0 我正在使用新风格的 Cabal 命令 为了在我处理包的同时测试它 使库可用于测试项目 我运行cabal new install lib构建包后 然而 我注
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 用parsec解析递归数据

    import Data Attoparsec Text Lazy import Data Text Lazy Internal Text import Data Text Lazy pack data List a Nil Cons a L
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control
  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • Haskell,堆栈:找到可执行文件

    我正在寻找类似的东西 stack whereis hasktags where whereis行为或多或少类似于 UNIXwhereis命令 hasktags是这样运行的 stack exec hasktags stack exec whe
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • Haskell / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • 简单 Haskell Monad - 随机数

    我正在尝试扩展代码这个帖子 https stackoverflow com questions 3944170 haskell and state 接受的答案 允许我能够基于以种子作为参数的函数 randomGen 调用 randomGen

随机推荐

  • kibana server.basePath 结果为 404

    我在 RHEL 7 2 上运行 kibana 4 4 1 当 kibana yml 文件不包含设置时一切正常server basePath Kibana 成功启动并吐出消息 info listening Server running at
  • 在哪里可以找到 PHP 的错误日志文件?

    在哪里可以找到错误日志文件 我需要检查它们以解决安装后显示的内部服务器错误suPHP https wiki archlinux org title SuPHP 您可以使用lsof https en wikipedia org wiki Ls
  • Asterisk AGI:如何获取或设置全局变量的值?

    我使用 Asterisk 1 8 和 PHP 来编写 AGI 脚本 EDIT 我正在努力从 AGI PHP 脚本中设置和获取全局变量的值 我可以设置通道变量 但不能设置全局变量 使用 PHPAGI 库 Tried Set varname v
  • Puppeteer 在非无头模式下打开一个空选项卡

    运行 puppeteer npm 的最新版本 0 13 0 并将参数传递给 puppeteer launch headless false chrome 以空页面作为第一个选项卡打开 并从第二个选项卡中的脚本打开实际页面 const pag
  • 尝试调整 2fs EB 卷大小失败 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个 200GB 的 EBS 卷 正在尝试增加可用空间 我按照以下说明进行操作 http www hellersoftware com
  • Swift:通过 Twitter 分享文本

    所以基本上我正在制作一个事件应用程序 一切都很顺利 只是将活动分享到了 Twitter 我已经在互联网上搜索过 但我得到的只是使用我不想要的 Twitter 的本机应用程序 我想使用浏览器发推文 我已经实现了这个方法用于FB共享 任何想法都
  • terraform 资源创建 - this 关键字

    我在几个例子中发现了一种模式terraform代码在Github resource aws vpc this 我想知道关键字如何this与命名资源相比 提供了特殊的优势 我找不到哈希公司文档关于this关键词 https github co
  • 正则表达式:仅匹配一次

    我有一个包含多个 IP 地址和一些随机内容的字符串 例如像这样的 21 Jun 2018 01 15 38 0000 188 79 169 152 157 52 69 50 443 GET 157 52 69 30 157 52 69 10
  • C++:删除打印机队列

    我正在尝试从打印机中删除队列中的所有文件 我发现这看起来很简单 我尝试使用下面的代码删除队列 它可以编译 但 SetPrinter 返回 false 我收到的错误消息是 5 我尝试使用该方法将其解码为 正常 错误消息从这个问题 https
  • 是什么导致 Safari 中的音频播放缓慢/延迟?

    var audio new Audio data audio wav base64 UklGRoABAABXQVZFZm10IBAAAAABAAEAiBUAAIgVAAABAAgAZGF0YVwBAACHlqa1xNLg7vv Tk1LSk
  • 按 iframe 内的 Youtube 订阅表单按钮

    我正在搜索如何从 Youtube 订阅表单按下订阅按钮 但我没有找到任何可以帮助我的东西 我是 JS 新手 所以我希望你能帮助我 用于按下订阅按钮here http www youtube com subscribe widget p aa
  • 如何在 JavaScript 中模拟 target="_blank"

    当用户单击链接时 我需要更新数据库中的字段 然后在新窗口中打开请求的链接 更新没问题 但我不知道如何打开新窗口而不要求他们单击另一个超链接 a href http www mydomain com ReportID 1 target bla
  • 如何在 ASP.NET MVC 3 Intranet 应用程序中重新验证用户身份?

    该应用程序已经使用 Windows 集成安全性 而不是 Forms 我想要完成的是所谓的 逐步 身份验证 或针对以下情况的 强制重新身份验证 用户正在浏览网站做一些常见的 琐碎的事情 突然 用户必须执行敏感操作 例如授权 资源分配或确认汽车
  • iPhone开发与越狱

    我是 iPhone 开发新手 我们可以通过以下方式开发iphone应用程序 legal 越狱 如果我越狱了我的iPhone操作系统 之后我可以安装最新版本的iPhone操作系统吗 并从苹果网站再次使其合法 如果我开发越狱应用程序 我可以将其
  • .NET MVC:调用 RedirectToAction 传递模型?

    我有一个观点List aspx与班级绑定的Kindergarten 在控制器中 public ActionResult List int Id Kindergarten k from k1 in kindergartensRepositor
  • Android - 包括 GitHub 库 ActionBar PullToRefresh

    我在包含来自 GitHub 的库时遇到问题 这是图书馆 https github com chrisbanes ActionBar PullToRefresh https github com chrisbanes ActionBar Pu
  • 我正在尝试通过外部 api 从 json 数据获取键值对,并使用 Angular 和 TypeScript 显示它。我怎样才能实现这个目标?

    我想从我的 api 获取结果对象中的每个键值对以显示在我的前端上 即 类别 类型 难度 问题正确答案 我已正确设置服务和组件 我需要做的就是获取 json 并显示每一对 该方法名称称为 fetchQuestions 如下所示 我只需简单地以
  • 是否可以一次性增加 YouTube api 的配额?

    我正尝试将大约 4 000 个视频添加到 YouTube 播放列表中 使用基于成本的配额系统 我每天只能添加大约 200 个 这意味着我需要大约三周的时间来完成这个项目 此外 我需要添加的视频列表将继续增长 直到我最终确定播放列表 因为它在
  • CF10-jpg的文件格式

    在开发一个允许交换多个第三方应用程序的图像并从而为这些应用程序创建单独的 皮肤 的工具时 我偶然发现了一种 jpg 格式 我似乎无法找到任何合适的信息 当在十六进制编辑器中查看它时 它以标签 CF10 开头 搜索互联网只提供了一个能够处理此
  • 如何在 WAI 服务器中执行关闭命令?

    我想为我的 web 应用程序实现一个 正常关闭 命令 与我的第一直觉相反 即只是要求人们终止该进程 我的前两次尝试包括 liftIO exitSuccess E yield responseLBS statusOK G contentTyp