管道Sink中的嵌套ResourceT范围

时间:2012-08-15 20:50:57

标签: haskell conduit

有没有办法将runResourceT范围扩展到单个Sink的生命周期?

我正在尝试构建一个包含潜在无限数量Sink的{​​{1}}。这适用于线程,但我试图没有线程。看起来应该是可能的。由于Sinks的范围,我遇到了障碍:我得到了太粗粒度(但功能性)或者太精细(完全破碎)的资源管理。

runResourceT

1 个答案:

答案 0 :(得分:2)

ResourceT仅用于在特殊情况下清理资源。它不打算提供提示最终确定,只提供保证完成。为了及时,conduit提供了自己的处理清理工具。在您的情况下,您正在寻找两者:您希望尽早进行清理,并且即使在抛出异常的情况下也会发生。为此,您应该使用bracketP。例如:

chunkWriter
  :: MonadResource m
  => FilePath -> Sink ByteString m ()
chunkWriter filePath = bracketP
    (putStrLn "alloc")
    (\() -> putStrLn "free")
    (\() -> Cl.isolate 100 =$= Cb.sinkFile filePath)

这导致所需的alloc和free输出交错。