我有一个用 Haskell 编写的规划算法,其任务是在给定时间内评估一组可能的计划,其中评估过程可以运行任意时间以产生越来越准确的结果。自然且据称最有效的方法是为每个评估任务提供自己的轻量级 Haskell 线程,并让主线程在休眠指定时间后收获结果。
但实际上,在整个可用时间内,总会有一个或两个线程处于 CPU 匮乏状态。我自己使用信号量/等来控制执行的实验表明,这个问题非常难以修复,因为我似乎无法强制给定线程停止执行(包括使用 Control.Concurrent 中的“yield”)。
是否有一种众所周知的方法来确保任意数量的 Haskell 线程(不是操作系统线程)在(相当短的)挂钟时间范围内接收大致均匀的 CPU 时间?如果做不到这一点,有一个好方法可以确保在给定数量的核心上执行相同迭代的多个线程相当“轮流”,从而使所有核心都得到使用?
最佳答案
据我所知,Haskell 线程应该全部接收大致相等的 CPU 功率,只要它们都在积极尝试工作。不会发生这种情况的唯一原因是它们开始进行阻塞 I/O 调用,或者每个线程仅运行几毫秒或其他时间。
也许您看到的问题实际上是每个线程只运行一瞬间,产生一个未计算的表达式作为其结果,然后主线程对其自身进行计算?如果是这样的话,看起来主线程正在获得所有的 CPU 时间。
关于haskell - 确保 Haskell 中线程之间的 CPU 时间分配均匀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18027408/