Haskell WAI/WAP响应资源清理
当HTTP客户机断开连接(或发生其他真实情况)时,无法确定如何进行清理。我试图将我的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
源代码
打包成一个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。学士学位包