Haskell中的并发性:如果单线程但设置为+;RTS-N
正如GHC文档所述,设置Haskell中的并发性:如果单线程但设置为+;RTS-N,haskell,ghc,haskell-platform,Haskell,Ghc,Haskell Platform,正如GHC文档所述,设置+RTS-N将使用多个线程来运行程序。如果我的程序是一个简单的单线程程序(即nopar,noforkIO),如下图所示,该怎么办 m = 10^6 wr 0 = return () wr i = do appendFile "/tmp/data.nothing" $ show(i)++"\n" wr (i-1) main = do wr m putStrLn "done" 但是,当我使用-Ds(调试调度器)标志运行
+RTS-N
将使用多个线程来运行程序。如果我的程序是一个简单的单线程程序(即nopar
,noforkIO
),如下图所示,该怎么办
m = 10^6
wr 0 = return ()
wr i = do
appendFile "/tmp/data.nothing" $ show(i)++"\n"
wr (i-1)
main = do
wr m
putStrLn "done"
但是,当我使用-Ds
(调试调度器)标志运行程序时,我得到了以下日志
all threads:
threads on capability 0:
threads on capability 1:
thread 7 @ 0x7fd5b0199000 is not blocked (TSO_DIRTY)
thread 1944 @ 0x7fd592dc6390 is not blocked (TSO_DIRTY)
thread 1945 @ 0x7fd592def8a8 is not blocked
thread 1946 @ 0x7fd592dc6790 is not blocked
thread 1947 @ 0x7fd592e0f790 is not blocked
thread 1948 @ 0x7fd592df2420 is not blocked
thread 1949 @ 0x7fd592df2000 is not blocked
thread 1950 @ 0x7fd592e0f000 is not blocked
thread 1951 @ 0x7fd592ddae90 is not blocked
thread 1952 @ 0x7fd5b0156cc0 is not blocked
thread 1953 @ 0x7fd5b2a2adc8 is not blocked
thread 1954 @ 0x7fd5b2920568 is not blocked
thread 1955 @ 0x7fd592c4b5a0 is not blocked
thread 1956 @ 0x7fd5b289e7a8 is not blocked (TSO_DIRTY)
thread 1957 @ 0x7fd592c4e160 is not blocked (TSO_DIRTY)
thread 1958 @ 0x7fd592dc54a8 is not blocked (TSO_DIRTY)
我真的很想知道这数千个线程在这里做什么?GHC线程和OS线程之间存在混淆 “一个线程由GHC的TSO(线程状态对象)表示[…]线程由功能运行,可以认为是由GHC管理的虚拟内核。功能反过来映射到真正的操作系统线程或任务,尽管我们不会过多地讨论它们。” 另见 实际上,您需要的是功能。如果您使用
+RTS-N1
运行您的程序,您将看到只有一个功能,2个用于+RTS-N2
等
您可能还注意到,即使您的程序本质上是单线程的,运行时系统也可以为其他任务(如垃圾收集器)使用不同的线程。Wait。。。您明确告诉运行时创建线程。。。然后你想知道为什么它会这样做?哈?也许他把OS线程和sparks混淆了。你确定
appendFile
不会启动任何sparks吗?@Cubic是和否。通过设置+RTS-N,我希望ghc会创建8个OS线程来运行所有用户空间线程。但我不明白的是为什么有这么多线程(我没有用forkio等创建任何线程)。我刚开始学习Haskell,所以这个问题可能很愚蠢,但我很困惑。@bl4ck5un带有ID的线程可能只是绿色线程。每个功能都在各自的(OS)线程上运行,因此您可能只有两个OS线程显示在那里。但是我不知道你的问题的答案,我也不认为这与Spark有关(这是纯代码中的并行性,所以这里不太可能出现)。