我正在学习书籍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,欢迎任何编译器/库进行此类并行编程。
答案 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宏也很适合。
总结:
答案 2 :(得分:0)
你可以看一下:http://www.clojure-toolbox.com
这是一个很好的资源。