Haskell WAI/WAP响应资源清理

Haskell WAI/WAP响应资源清理,haskell,conduit,Haskell,Conduit,当HTTP客户机断开连接(或发生其他真实情况)时,无法确定如何进行清理。我试图将我的源代码打包成一个addCleanup,但没有调用它 下面是我的infinte源代码通过testrings进行流式处理的最小示例: {-# LANGUAGE OverloadedStrings #-} module Main where import Network.Wai import Network.HTTP.Types import Network.Wai.Handler.Warp (run) impor

当HTTP客户机断开连接(或发生其他真实情况)时,无法确定如何进行清理。我试图将我的
源代码
打包成一个
addCleanup
,但没有调用它

下面是我的infinte源代码通过testrings进行流式处理的最小示例:

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run)
import Data.ByteString.Lazy.Char8 ()

import Control.Monad
import Control.Monad.Trans
import Control.Concurrent (threadDelay)

import Data.Conduit
import Blaze.ByteString.Builder (Builder)
import qualified Blaze.ByteString.Builder.ByteString as BBBB
import qualified Data.ByteString.Char8 as BS

stream :: Source (ResourceT IO) (Flush Builder)
stream = addCleanup (\_ -> liftIO $ putStrLn "cleanup.") $ do
    liftIO $ putStrLn "source started."
    yield Flush

    forever $ do
        yield $ bchunk "whatever"
        yield Flush
        liftIO $ threadDelay 10000

app :: Application
app req = do
    liftIO $ putStrLn "in the handler."
    return $ ResponseSource status200 [("Content-Type", "text/plain")] stream

main :: IO ()
main = run 3000 app

bchunk = Chunk . BBBB.fromByteString . BS.pack

当我用http请求点击它时,“启动”通知出现,
流开始净化数据。但是,在我关闭连接后,不会出现“cleanup.”消息,也不会执行任何操作,因此会在实际代码中泄漏资源。

我认为首选的清理方法是使用
分配
注册
函数,这些函数是在
Control.Monad.Trans.Resource.MonadResource
上定义的。无论异常与否,
ResponseSource
终止时,这将调用处理程序

查看
addCleanup
代码,它仅用于常规(非异常)完成

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run)
import Data.ByteString.Lazy.Char8 ()

import Control.Monad
import Control.Monad.Trans
import Control.Monad.Trans.Resource
import Control.Concurrent (threadDelay)

import Data.Conduit
import Blaze.ByteString.Builder (Builder)
import qualified Blaze.ByteString.Builder.ByteString as BBBB
import qualified Data.ByteString.Char8 as BS

stream :: MonadResource m => Source m (Flush Builder)
stream = do
  -- the release key can be used for early cleanup
  _releaseKey <- lift . register $ putStrLn "cleanup."

  liftIO $ putStrLn "source started."
  yield Flush

  forever $ do
    yield $ bchunk "whatever"
    yield Flush
    liftIO $ threadDelay 10000

app :: Application
app _ = do
  liftIO $ putStrLn "in the handler."
  return $ ResponseSource status200 [("Content-Type", "text/plain")] stream

main :: IO ()
main = run 3000 app

bchunk :: String -> Flush Builder
bchunk = Chunk . BBBB.fromByteString . BS.pack
{-#语言重载字符串}
模块主要在哪里
导入网络.Wai
导入Network.HTTP.Types
导入Network.Wai.Handler.Warp(运行)
导入Data.ByteString.Lazy.Char8()
进口管制
进口管制.Monad.Trans
导入控制.Monad.Trans.Resource
导入控制。并发(线程延迟)
导入数据。管道
导入Blaze.ByteString.Builder(Builder)
将符合条件的Blaze.ByteString.Builder.ByteString作为BBBB导入
将符合条件的Data.ByteString.Char8作为BS导入
stream::MonadResource m=>Source m(Flush Builder)
stream=do
--释放键可用于早期清理
_释放键刷新生成器
bchunk=块。BBBB.fromByteString。学士学位包