【发布时间】:2011-02-16 16:37:21
【问题描述】:
我正在尝试决定是用 Ruby 还是 Clojure 实现应用程序。其中两个要求涉及并行处理:
应用程序必须进行并行调用以通过 Internet 获取 XML 提要和其他类型的数据。进行了许多这样的调用,并且将调用序列化是低效的。
理想情况下,对这些调用的响应应该并行处理。处理主要意味着将原始 XML 转换为更小的结构化数据(Ruby 哈希或 Clojure 映射)并将其插入 MySQL 数据库或 CouchDB 数据库。
我比 Clojure 更了解 Ruby,但如果这是适合 Clojure 的项目,我完全赞成使用它。
Clojure 的pmap 函数似乎非常适合这两个要求。我想知道是否某些 Ruby 库或功能具有类似的干净和简单的方法来执行上述并行处理任务。
【问题讨论】:
-
另外,有谁知道 pmap 是否会阻止太多线程同时产生和运行?
-
@dan pmap 具有某种“半惰性的速率控制,因为并行计算保持领先于消耗,但除非需要,否则不会实现整个结果”(clojure docs)
-
好吧,有点含糊但很有用
-
@dan:从源代码中,我看到它一次最多运行
(+ 2 (.. Runtime getRuntime availableProcessors))个线程,并且仅在您需要它们时计算更多。 (我不完全了解内部结构,因为我一般不懂语言。) -
@Andrew:MRI 使用绿色线程并且一次只使用一个处理器。 YARV 使用 Posix 线程,但有一个全局解释器锁,可以消除(几乎?)所有并发性。但是,当目标是在等待阻塞 I/O 时执行其他操作时,线程在两个解释器中都可以很好地工作,就像这里的情况一样。 (我以前做过。)