【发布时间】:2019-11-26 18:58:48
【问题描述】:
我试图了解父操作系统线程和各种子操作系统线程如何在使用 GHC -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)
看起来我得到了N*2 + 1 这些“hello:w”线程,因为我改变了+RTS -N。
这些“hello:w”线程是什么,为什么每个 HEC + 1 显然有两个?
ghc_ticker 是做什么的?
我还注意到我正在使用 +RTS -N4 测试的大型真实服务,例如这些“my-service:w”线程中的 14 个,并且在负载下这些进程 ID 似乎在搅动(其中一半在我终止服务之前保持活动状态)。
为什么是 14 个,为什么有一半会生成并死亡?
我也接受一个有助于指导我检测我的代码以找出后两个问题的答案。
【问题讨论】:
-
很确定这些是
safeffi 调用的线程池。
标签: multithreading haskell ghc child-process