나는이 주제에 대한 전문가가 아니지만 어쨌든 나는 그것을 줄 것이다.
GHC (Haskell 컴파일러)에는 하나 이상의 HEC (Haskell 실행 컨텍스트, cap 또는 기능이라고도 함)가있을 수 있습니다. 런타임 플래그 +RTS -N <number>
또는 setNumCapabilities
기능을 사용하면 프로그램에서 사용할 수있는 HEC의 수를 정의 할 수 있습니다. 하나의 HEC는 하나의 운영 체제 스레드입니다. 런타임 스케줄러는 HEC 사이에 하스켈 경량 쓰레드를 분배합니다.
forkOn
기능을 사용하면 스레드가 실행 된 HEC를 선택할 수 있습니다. getNumCapabilities
은 기능 수 (HEC)를 반환합니다.
스레드 마이그레이션은 하스켈 스레드를 다른 HEC로 마이그레이션 (이동) 할 수 있음을 의미합니다. 런타임 플래그 +RTS -qm
은이 스레드 마이그레이션을 비활성화합니다.
문서는 약 forkOn
그
forkIO처럼을 주장하지만 스레드를 실행해야하는 기능에 지정할 수 있습니다. forkOn 스레드와 달리 forkOn에 의해 생성 된 스레드는 전체 수명 동안 동일한 기능을 유지합니다 (forkIO 스레드는 스케줄링 정책에 따라 기능간에 마이그레이션 할 수 있음).
그래서 forkOn
으로 하나의 단일 HEC를 선택하는 것이 가능 스레드가에 달려있다.
이 스레드에 의해
외국 통화를 할 보장 할 수 없습니다한다고 forkIO
비교 특정 OS 쓰레드에 의해; 특정 OS 스레드가 외래 호출을해야하는 경우 대신 forkOS를 사용하십시오.
이제는 forkOn
기능과 +RTS -qm
(비활성화 된 스레드 마이그레이션) 같은 것이 있습니까? 아마도 그렇지 않습니다. forkOn
사용자는 Haskell 스레드가 실행되는 HEC를 명시 적으로 선택합니다 (예를 들어, 모든 Haskell 스레드를 동일한 HEC에 넣을 수 있음). +RTS -qm
및 forkIO
으로 하스켈 스레드 HECS 사이를 전환하지 않지만, HEC는 forkIO
에 의해 산란 하스켈 스레드가 끝나는 알 방법이 없습니다
참조를 :.