在 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
注意:
输出可能同时发生。即使不太可能,输出字符串 14
和 25
也有可能交错为 1245
。应该使用另一把锁来防止这种情况。
两个Haskell线程可能运行在不同的核心上,也可能在同一个核心上。如果计算很长,如果我们使用线程 RTS(使用 -threaded
编译),并且如果我们指定了足够多的核心(运行 可执行文件 ./myExe +RTS -N2 -RTS
,使用 -N
单独会选择所有可用的内核),RTS应该使用多个内核。
在这里,在我得到的两个线程中计算fib 38
和fib 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 线程之上,大致只使用一个核心。
我想在 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
注意:
输出可能同时发生。即使不太可能,输出字符串
14
和25
也有可能交错为1245
。应该使用另一把锁来防止这种情况。两个Haskell线程可能运行在不同的核心上,也可能在同一个核心上。如果计算很长,如果我们使用线程 RTS(使用
-threaded
编译),并且如果我们指定了足够多的核心(运行 可执行文件./myExe +RTS -N2 -RTS
,使用-N
单独会选择所有可用的内核),RTS应该使用多个内核。
在这里,在我得到的两个线程中计算fib 38
和fib 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 线程之上,大致只使用一个核心。