Haskell中是否有任何方法(对于需要在Linux和Windows上运行的代码,使用GHC来执行有界计算)?也就是说,“如果可行的话,计算此函数的结果,但如果尝试使用了超过X个CPU周期,Y堆栈空间或Z堆空间,但仍未完成,请停止并返回指示无法完成计算“?
答案 0 :(得分:8)
System.Timeout.timeout :: Int -> IO a -> IO (Maybe a)
答案 1 :(得分:6)
这是可能尝试的hackish解决方案:使用forkIO
生成计算,并让父线程(或可以访问分叉线程的ThreadId
的监视线程)定期轮询您想要的任何数量,并在必要时向计算线程抛出异步异常(有趣的是,这正是timeout
的工作原理。)
接下来的问题是,是否有办法找出Haskell中当前堆的大小。您可以通过生成shell命令或以其他方式查询操作系统来查找总内存消耗和周期(我不知道如何在Windows上执行此操作。)
这不是一个完美的解决方案,但它很简单,你可以在几分钟内实现和测试。
答案 2 :(得分:6)
在每个进程级别,您可以使用GHC's RTS options来控制最大堆栈和堆大小。