【发布时间】:2021-02-04 15:17:30
【问题描述】:
每一篇关于异常的 Haskell 文章都在重复一个简单的模式:使用括号函数分配/释放资源,你会很安全。
我有一个顾虑,因为我测试了它的行为并检测到线程在发布部分工作时可能会出现异步异常。
import Control.Exception
import Control.Concurrent
main = do
tid <- forkIO myThread
threadDelay 100000
throwTo tid StackOverflow
threadDelay 1000000
myThread =
bracket
(putStrLn "NEW")
(\() -> threadDelay 500000 >> putStrLn "CLEAN")
(\() -> putStrLn "USE")
在上面的 sn-p 中,“CLEAN”由于异步异常而没有打印 - 所以资源泄漏!如何声称它是安全的?
我不知道这一定是一个原因。 为了确保安全,我需要将每次清洁都包裹在面罩内。看起来很笨拙。
【问题讨论】:
-
@Cubic 显然在存在异步异常的情况下您无法安全地做任何事情。可能会在您的清理函数运行之前抛出一个,并跳过整个清理函数
-
简短回答使用
unliftio,它已经为所有异常处理功能做了正确的事情:github.com/fpco/unliftio/blob/…
标签: haskell asynchronous exception concurrency