Что я понимаю, Haskell имеют зеленые потоки. Но как легкий вес - они. Действительно ли возможно создать 1 миллион потоков?
Или Сколько времени это взяло бы для 100 000 потоков?
Согласно здесь размер стека по умолчанию составляет 1 КБ, поэтому я предполагаю, что теоретически можно было бы создать 1000000 потоков - стек займет около 1 ГБ памяти .
из здесь .
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
на моем не совсем 2,5-гигабайтном ноутбуке это занимает меньше секунды.
установите n на 1000000, и становится трудно записать остальная часть этого поста, потому что ОС работает как сумасшедшая. определенно используя больше, чем гиг барана (не позволил ему закончить). Если у вас достаточно ОЗУ, она определенно будет работать в 10 раз быстрее, чем версия 100000.
Используя тест здесь, http://www.reddit.com/r/programming/comments/a4n7s/stackless_python_outperforms_googles_go/c0ftumi
Вы можете улучшить производительность на per бенчмарк-базис, уменьшив размер стека потоков до того, который соответствует эталонному тесту. Например, поток 1M со стеком 512 байт на поток занимает 2,7 секунды
$ time ./A +RTS -s -k0.5k