我目前主要使用以下代码来启动工作线程。
import Control.Monad (void)
import Control.Concurrent (forkIO)
import Control.Exception (finally)
import Data.IORef (newIORef, writeIORef, readIORef)
startWorker :: IO a -> IO (IO Bool)
startWorker work = do
running <- newIORef True
_ <- forkIO $ void work `finally` writeIORef running False
return $ readIORef running
IE。开始在后台做一些工作并返回一个 IO 操作,让调用者轮询工作线程是否仍在运行或由于某种原因已停止。
这种方法有多可靠?是否存在线程在不调用
finally
的情况下死亡的情况?块(当然,不包括整个进程被杀死的情况)?有没有更好的方法来实现相同的功能?
最佳答案
异步异常可能会在线程创建后触发,但在“void work `finally` writeIORef running False”启动之前。使用 forkFinally处理那个。
我可以想象还有其他问题。我推荐 async图书馆。它为您处理所有的复杂性。使用 poll查看 Async
地位。
关于multithreading - 检查线程是否仍在运行的可靠方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22711426/