确保Haskell中线程之间的CPU时间分布均匀

确保Haskell中线程之间的CPU时间分布均匀,haskell,concurrency,Haskell,Concurrency,我有一个用Haskell编写的计划算法,任务是在给定的时间内评估一组可能的计划,其中评估过程可以运行任意时间,以产生越来越精确的结果。实现这一点最自然、据说也是最有效的方法是为每个评估任务提供自己的轻量级Haskell线程,并让主线程在睡眠指定时间后获取结果 但实际上,在整个可用时间内,总是有一两个线程需要CPU。我自己用信号量/etc来控制执行的实验表明,解决这个问题非常困难,因为我似乎无法强制给定的线程停止执行(包括使用control.Concurrent的“yield”) 有没有一种众所周

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

但实际上,在整个可用时间内,总是有一两个线程需要CPU。我自己用信号量/etc来控制执行的实验表明,解决这个问题非常困难,因为我似乎无法强制给定的线程停止执行(包括使用control.Concurrent的“yield”)


有没有一种众所周知的方法可以确保任意数量的Haskell线程(不是OS线程)在一段(相当短的)挂钟时间内,每个线程接收的CPU时间大致相等?如果做不到这一点,一个很好的方法是确保在给定数量的内核上执行相同迭代的多个线程公平地“轮流”,这样所有的内核都被使用?

好吧,Haskell线程都应该获得大致相等的CPU功率,只要它们都在积极地尝试工作。不会发生这种情况的唯一原因是,如果它们开始进行阻塞I/O调用,或者每个线程只运行几毫秒或其他时间


也许您看到的问题实际上是每个线程只运行了一秒钟,产生一个未计算的表达式作为其结果,然后主线程对其自身进行计算?如果是这样的话,看起来主线程占用了所有的CPU时间。

你能让你的线程每隔一段时间向中央调度线程签入一次吗。。。比如说,每1000次迭代或者类似的事情?试着看看协作线程实现。注意:您还可以同时计算这些
线程中的许多
线程。请确保计算线程之间共享的值(例如到)。你如何准确地测量每个线程的CPU时间?@Wagner-是的,但是如何让中心线程锁定那些走得太远的计算线程,在防止只剩下一个内核的情况下评估一个落后的线程时?@Petr-目前我只是在看每个线程完成了多少次迭代,因为在所有情况下,一次迭代所需的时间应该相当相似。不过,如果有一个函数返回总线程CPU时间,这将很有帮助。