Prelude Control.Concurrent.Async Data.List>做{_< - async $ return $! foldl'(+)0 [0,0.1 .. 1e + 8 :: Double];打印“异步丢失!”} “异步失败!”
一个处理器核心开始疯狂一段时间,界面保持正常。显然线程已经启动,只要有事可做就会运行。
但是(效率除外),原则上是好的,还是Async
始终是cancel
led或wait
?有什么东西会破坏,因为没有办法再读取结果吗? GC是否正确清理了一切?事实上,这个线程可能会被停止,而当我尝试它时(由于内存压力不足)这种情况还没有发生?只有当forkIO
ed动作结束时,线程是否正确地“结束”?
我对这种并发性的东西很不确定。也许我仍然在用C ++方式考虑这个问题。 RAII /确定性垃圾收集肯定会让你在这方面有更好的照顾......
答案 0 :(得分:7)
在内部,Async
只是一个Haskell线程,在完成时写入STM TMVar
。 cancel
只是向Haskell线程发送一个终止信号。在Haskell中,您不需要explcititly杀死线程。如果Async
本身可以被垃圾收集,那么线程仍将运行到最后,然后一切都将被正确清理。但是,如果Async
以异常结束,则wait
会将异常传播到等待的线程。如果你没有wait
,你永远不会知道发生了异常。