【发布时间】:2020-02-10 23:38:52
【问题描述】:
我现在多次遇到的一种模式是,需要通过在其上映射一些测试并查看是否有任何或所有元素通过来检查值列表。典型的解决方案就是使用方便的内置函数all 和any。
问题是这些是串行评估的。在许多情况下,一旦 any 线程为 all 找到“假”或为 @ 找到“真”,在完成进程的同时进行并行评估会快得多 987654329@。我很确定使用 Control.Parallel 无法实现短路行为,因为它需要进程间通信,而且我还没有足够的 Control.Concurrent 来实现它。
这是数学中非常常见的模式(例如 Miller-Rabin Primality),所以我觉得有人可能已经为此提出了解决方案,但出于显而易见的原因,在谷歌搜索“并行或/和/任何/ all on list haskell" 不会返回很多相关结果。
【问题讨论】:
-
您可能会发现Parallel and Concurrent Programming in Haskell 很有用,尤其是章节2、3 和4。
-
这可以通过
unamb库实现 -
@luqui 迷人的;我会搞砸这个。如果我用这个写一个很好的平行所有/任何我会把它作为答案发布。
-
在尝试并行化任何东西之前,请考虑在 fork 一个新进程所需的时间内可以测试多少个条件。
-
@chepner 你在说什么?我们在这里不是在谈论 bash!我们可以使用线程进行并发和并行处理(无论是 C 中的
pthreads还是 Haskell 中的绿色线程)您无需启动多个 Web 服务器来处理并发 Web 请求,而是在单个进程中运行多个线程!这同样适用于并行性。您可以启动与 CPU 一样多的线程并平均分配您的工作,从而处理 CPU 密集型任务。试试这个库来说服自己github.com/lehins/haskell-scheduler
标签: haskell testing concurrency parallel-processing any