하스켈에서 작성한 계획 알고리즘은 주어진 시간 내에 가능한 계획 세트를 평가하는 작업으로, 평가 프로세스는 임의의 금액으로 실행될 수 있습니다 점점 더 정확한 결과를 얻을 수있는 시간을 갖게됩니다. 자연스럽고 가장 효율적인 방법은 각 평가 작업에 가벼운 Haskell 스레드를 제공하고 지정된 시간 동안 잠자기 후에 주 스레드가 결과를 수집하도록하는 것입니다.하스켈에서 스레드 간의 CPU 시간 분포를 보장합니다.
실제로는 항상 하나 또는 두 개의 스레드가 사용 가능한 전체 시간 동안 CPU 부족 상태가됩니다. 실행을 제어하기위한 세마포어/실험에 대한 내 자신의 실험은 주어진 스레드가 강제로 실행을 멈추게 할 수 없으므로이를 수정하는 것이 놀랍도록 어려웠습니다 (Control.Concurrent에서 "yield"사용 포함).
얼마나 많은 수의 Haskell 쓰레드 (OS 쓰레드가 아닌)가 각각 벽 시계 시간 (대략 짧은 시간)에 걸쳐 거의 균등 한 CPU 시간을 갖도록하는 좋은 방법이 있습니까? 그렇게하지 않으면 모든 코어가 사용되는 것과 같이 주어진 수의 코어에서 똑같은 반복을 실행하는 많은 스레드가 공정하게 "교대로 돌아갈"것을 보장하는 좋은 방법입니까?
스레드를 중앙 스케줄링 스레드로 자주 체크인 할 수 있습니까? 예를 들어, 1000 회 반복마다 그런가요? –
협력 스레드 구현 [여기] (http://www.haskellforall.com/2013/06/from-zero-to-cooperative-threads-in-33.html)을 살펴보십시오. 이'Thread's들 중 많은 것들을 동시에 평가할 수도 있습니다. – cdk
스레드간에 공유 된 값이 평가되는지 확인하십시오 ([NF] (http://hackage.haskell.org/packages/archive/deepseq/latest/doc/html/Control-DeepSeq.html#t:NFData), 예를 들어). 각 스레드가 얼마나 많은 CPU 시간을 사용하는지 정확하게 측정합니까? –