假设我有一个只使用forkOn
生成线程的程序。在这种情况下,不同功能之间不会对Haskell线程进行负载平衡。那么在使用和不使用+RTS -qm
的情况下执行此程序是否有区别?
根据文档,-qm
禁用线程迁移,我认为它与仅使用forkOn
具有相似的效果。我在这个假设中是否正确?我不确定文件在这方面有多清楚。
答案 0 :(得分:4)
我不是这方面的专家,但无论如何我都会试一试。
GHC(Haskell编译器)可以有一个或多个HEC(Haskell执行上下文,也称为上限或功能)。通过运行时标志+RTS -N <number>
或setNumCapabilities
功能,可以定义可用于程序的HEC数量。一个HEC是一个操作系统线程。运行时调度程序在HEC之间分配Haskell轻量级线程。
使用forkOn
函数,可以选择运行线程的HEC。 getNumCapabilities
返回功能数(HEC)。
线程迁移意味着可以将Haskell线程迁移(移动)到另一个HEC。运行时标志+RTS -qm
禁用此线程迁移。
有关forkOn
州的文件
与forkIO类似,但允许您指定线程应运行的功能。与forkIO线程不同,forkOn创建的线程将在其整个生命周期内保持相同的功能(forkIO线程可以根据调度策略在功能之间进行迁移)。
所以使用forkOn
,可以选择运行线程的单个HEC。
与陈述
的forkIO
相比
此线程进行的外部调用不保证由任何特定的OS线程进行;如果您需要由特定OS线程进行外部调用,请改用forkOS。
现在,forkOn
函数和+RTS -qm
(禁用线程迁移)是一样的吗?可能不是。使用forkOn
用户显式选择运行Haskell线程的HEC(例如,可以将所有Haskell线程放入相同的HEC)。使用+RTS -qm
和forkIO
时,Haskell线程不会在HEC之间切换,但是无法知道forkIO
生成的Haskell线程的哪个HEC结束。
参考文献: