什么是用于内置构造的并行编程的好库

时间:2016-05-05 02:32:51

标签: multithreading clojure parallel-processing

我正在学习书籍The Art of Parallel Programming的并行编程。本书使用基于C语言构建的C*语言。

C *有自己的构造,如forall,它是supercool。它创建了我想要的尽可能多的并行进程。这里的过程意味着要同时执行的并行任务。

例如

struct Artist {
             char name[12];
             char desc[6][20];
             int plays;
          };

struct Artist artists[10000];

forall index = 1 to sizeof(artists) grouping 1000 do

    sendEmail(artists[index])

这将创建一个每个1000条记录的过程,如果有10000条记录,那么将创建10000/1000 = 10个进程。每个流程都会同时向Artist发送电子邮件。

我很好奇是否有类似的构造可以在生产中使用的语言。

C *对于学术目的来说似乎是一个不错的编译器,但是对于生产没有好处,也不是开源的,只能在Window OS上运行。

I looked upon golang, but I dont think it has one.

I read that Fortress has parallel for loop.

例如。要塞

for l <- seq(f.lines) do println l end
for l ← seq(f .lines) do println l end

clojure,golang,rust,欢迎任何编译器/库进行此类并行编程。

3 个答案:

答案 0 :(得分:1)

你可能还想看看reducers,这是一个很好的内置机制,用于某些并行计算:

(require '[clojure.core.reducers :as r])

(defn par-map [chunk-size f coll]
  (r/fold chunk-size
          (fn ([] []) ([c1 c2] (concat c1 c2)))
          conj
          (r/map f coll)))

(par-map 10 inc (vec (range 100)))

但你应该记住,该集合应该是可折叠的(例如持久性矢量或地图)

答案 1 :(得分:0)

Clojure肯定有所有的构造来做你正在寻找的东西。例如,pmap将懒惰地将函数并行应用于元素序列。它不会自行对元素进行分组,但可以很容易地与partition-all函数组合,将原始序列划分为指定大小的分组。然后可以使用concat将结果连接回单个序列。

例如,这是一个函数,它将两个序列的函数并行映射,具有指定的组大小:

(defn pmap-grouping [f group-size xs ys]
    (apply concat (pmap (partial mapv f)
                        (partition-all group-size xs)
                        (partition-all group-size ys))))

例如,(pmap-grouping + 2 [1 2 3] [4 5 6])会返回(5 7 9)。请注意,我已经写了pmap-grouping来采用固定数量的序列来减少不熟悉的语法,但重写它以使用任意数量的序列(任何数字)都是微不足道的1或更高):

(defn pmap-grouping [f group-size & cols]
    (apply concat (apply pmap (partial mapv f)
                              (map (partial partition-all group-size)
                                   cols))))

请注意,使用pmap的此实现与您对forall的描述之间存在一些差异。例如,pmap使用(最多)固定数量的线程。另一方面,这可能是你想要的,因为太多线程会导致颠簸。

即使Clojure没有pmap,也可以编写自己的pmap直接使用线程。肯定会有更多的工作,但肯定是可能的。实际上,您真正需要的是一种支持线程和高阶函数的语言。此外,函数与对象同构(即,您可以使用对象实现函数,反之亦然)。因此,几乎任何支持线程的语言都可以使用。

到目前为止,我们已经讨论过一种功能性方法。如果你使用一种函数式语言,这种方法很干净,编写得很好。但是,如果你想获得语法抽象,Clojure宏也很适合。

总结:

  • 您可以使用任何语言对线程进行并行编程,但您可能需要在某些语言中完成比其他语言更多的工作。
  • 功能语言允许以简洁和可组合的方式表达并行计算。
  • 如果你想要语法抽象,你要么必须使用内置所需语法的语言,要么使用支持语法扩展的语言(例如Clojure),例如,宏。

答案 2 :(得分:0)

你可以看一下:http://www.clojure-toolbox.com
这是一个很好的资源。