在 Haskell 的控制台上同时打印 2 o/p 秒

Printing 2 o/p s at same time on console in Haskell

我想在 Haskell.

中同时在控制台上打印两个不同函数的实时输出

可以吗?

您可以使用此代码...

import Control.Parallel

main = a `par` b `par` c `pseq` print (a + b + c)
              where
                  a = ack 3 10
                  b = fac 42
                  c = fib 34


fac 0 = 1
fac n = n * fac (n-1)

ack 0 n = n+1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))

fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

我希望a和b在不同的核上同时计算,并同时在控制台打印它们的进度。

您可以 运行 通过使用 forkIO 生成两个线程来进行两个并发的 print 操作。每个线程计算并打印自己的输出,然后通知主线程终止。

例如:

main :: IO ()
main = do
   v1 <- newEmptyMVar
   v2 <- newEmptyMVar
   forkIO $ do
     print (10+4)
     putMVar v1 ()
   forkIO $ do
     print (20+5)
     putMVar v2 ()
   -- wait for the threads
   takeMVar v1
   takeMVar v2

注意:

  1. 输出可能同时发生。即使不太可能,输出字符串 1425 也有可能交错为 1245。应该使用另一把锁来防止这种情况。

  2. 两个Haskell线程可能运行在不同的核心上,也可能在同一个核心上。如果计算很长,如果我们使用线程 RTS(使用 -threaded 编译),并且如果我们指定了足够多的核心(运行 可执行文件 ./myExe +RTS -N2 -RTS,使用 -N单独会选择所有可用的内核),RTS应该使用多个内核。

在这里,在我得到的两个线程中计算fib 38fib 39

$ time ./ParallelExample ; time ./ParallelExample +RTS -N2 -RTS
39088169
63245986

real    0m9.094s
user    0m9.076s
sys 0m0.020s
39088169
63245986

real    0m5.823s
user    0m9.532s
sys 0m0.040s

在第一个测试中,两个 Haskell 线程 运行 在同一个 OS 线程之上,大致只使用一个核心。