在Haskell中同步并行进程

Soh*_* Si 0 parallel-processing monads haskell

在Haskell中,如何print并行运行多个(monad?)函数(例如)并按照完成时间的顺序查看它们的输出?我想要三个进程,每个进程最终都在打印函数中.

import Control.Parallel
main = a `par` b `pseq` (a,b)
    where
        a = print("ack",ack 3 10)
        b = print("fac",fac 42)
Run Code Online (Sandbox Code Playgroud)

如果我不使用pseq,它将显示par组合指定的最后一个.我想确保在程序结束之前完成所有进程.我试过这个,但它没有显示a,b的输出:

...
main = a `par` b `pseq` print("done.")
...
Run Code Online (Sandbox Code Playgroud)

注意:我的程序以以下行结束:

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))
Run Code Online (Sandbox Code Playgroud)

Fra*_*ser 6

不要Control.Parallel用于同时运行IO操作.

Control.Concurrent.Async应该做你想做的事情 - Control.Parallel用于提示可以同时评估哪些纯操作,而不是同时运行多个动作(monadic或其他).

  • 不,因为那不是`Control.Parallel'所针对的(告诉编译器"嘿,如果你可以同时计算这两个结果,一起解决,因为你会更快地得到完整答案"),`Async `是为了说"与其他事情同时做这件事". (2认同)