有没有办法将runResourceT
范围扩展到单个Sink
的生命周期?
我正在尝试构建一个包含潜在无限数量Sink
的{{1}}。这适用于线程,但我试图没有线程。看起来应该是可能的。由于Sinks
的范围,我遇到了障碍:我得到了太粗粒度(但功能性)或者太精细(完全破碎)的资源管理。
runResourceT
答案 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输出交错。