在Haskell中创建100万个线程需要多长时间?

Fli*_*man 14 concurrency multithreading haskell green-threads

据我所知,Haskell有绿线.但他们的重量有多轻.是否有可能创建100万个线程?

或者10万个线程需要多长时间?

bar*_*ley 17

这里开始.

import Control.Concurrent
import Control.Monad

n = 100000

main = do
    left  <- newEmptyMVar
    right <- foldM make left [0..n-1]
    putMVar right 0    -- bang!
    x <- takeMVar left -- wait for completion
    print x
 where
    make l n = do
       r <- newEmptyMVar
       forkIO (thread n l r)
       return r

thread :: Int -> MVar Int -> MVar Int -> IO ()
thread _ l r = do
   v <- takeMVar r
   putMVar l $! v+1
Run Code Online (Sandbox Code Playgroud)

在我不太2.5的笔记本电脑上,这需要不到一秒钟.

将n设置为1000000并且很难写出这篇文章的其余部分,因为操作系统像疯了一样分页.绝对使用超过一个公羊(没有让它完成).如果你有足够的RAM,它肯定会在100000版本的适当时间内工作10倍.


Jus*_*tin 4

根据here,默认堆栈大小为1k,因此我认为理论上可以创建1,000,000 个线程 - 堆栈将占用大约1Gb 的内存。

  • 真的吗?我认为 1k 相当小 - C++ 中的默认堆栈大小是 1MB。 (4认同)