确保Haskell中的线程之间的CPU时间分配

时间:2013-08-02 23:03:53

标签: haskell concurrency

我有一个用Haskell编写的计划算法,其任务是在给定的时间内评估一组可能的计划,其中评估过程可以运行任意时间量以产生越来越准确的结果。这种自然且据称最有效的方法是为每个评估任务提供自己的轻量级Haskell线程,并让主线程在睡眠指定的时间后收集结果。

但实际上,在整个可用时间内,一个或两个线程总是会缺乏CPU。我自己用信号量/等来控制执行的实验已经证明这很难解决,因为我似乎无法强迫给定的线程停止执行(包括使用Control.Concurrent中的“yield”。)

是否有一种众所周知的方法可以确保任意数量的Haskell线程(不是OS线程)在(相当短的)挂钟时间范围内每次都能获得大致均匀的CPU时间?如果不这样做,确保执行相同迭代的多个线程在给定数量的内核上“轮流”以便使用所有内核的好方法?

1 个答案:

答案 0 :(得分:3)

AFAIK,Haskell线程应该所有接收大致相等的CPU功率,只要它们都在积极尝试工作。唯一不会发生的原因是它们是否开始进行阻塞I / O调用,或者每个线程只运行几毫秒或其他什么。

或许你看到的问题实际上是每个线程只运行一瞬间,产生一个未评估的表达式作为结果,然后主线程自己评估?如果是这种情况,看起来主线程正在获得所有CPU时间。