我正在尝试理解使用-threaded
编译的Haskell程序中,父线程和各个子线程是如何工作的。
使用:
module Main where
import Control.Concurrent
main = do
threadDelay 9999999999
例如,在 ghc 8.6.5 上使用 -threaded
进行编译,并通过 +RTS -N3
运行时,我可以看到
$ pstree -p 6615
hello(6615)─┬─{ghc_ticker}(6618)
├─{hello:w}(6616)
├─{hello:w}(6617)
├─{hello:w}(6619)
├─{hello:w}(6620)
├─{hello:w}(6621)
├─{hello:w}(6622)
└─{hello:w}(6623)
看起来当我改变
+RTS -N
时,我会得到N*2 + 1
个"hello:w"线程。
这些"hello:w"线程是什么,每个HEC + 1为什么会有两个线程?
ghc_ticker
是做什么的?
我还注意到,在我使用+RTS -N4
的大型实际服务中,我会得到14个这样的"my-service:w"线程,并且在负载下,这些进程ID似乎会变动(其中一半保持活动状态,直到我杀死服务)。
为什么是14个,其中一半会生成和消失?
我也接受一个回答,帮助指导我如何对我的代码进行工具化,以解决后两个问题。