gpt4 book ai didi

QtConcurrent的Scala类似物

转载 作者:行者123 更新时间:2023-12-04 02:57:14 25 4
gpt4 key购买 nike

QtConcurrent用于Scala(或Java)的类似物是什么?即简化了MapReduce,并行映射和foldl的实现。
谢谢

最佳答案

您可以使用Scala并行集合。它们目前是Scala夜间发行版的一部分,并将在Scala 2.9中发行。这个想法是,常规集合中可用的大多数操作都是并行的,因此可以以相同的方式使用并行集合。

当前,有一些可用的收集类型-并行范围,并行数组和并行哈希尝试。例如,您可以在并行数组上调用并行的mapfold操作,如下所示:

scala> val pa = (0 until 10000).toArray.par
pa: scala.collection.parallel.mutable.ParArray[Int] = ParArray(0, 1, 2, 3, 4, 5, 6,...

scala> pa.map(_ + 1)
res0: scala.collection.parallel.mutable.ParArray[Int] = ParArray(1, 2, 3, 4, 5, 6, 7,...

scala> pa map { v => if (v % 2 == 0) v else -v }
res1: scala.collection.parallel.mutable.ParArray[Int] = ParArray(0, -1, 2, -3, 4, -5,...

scala> pa.fold(0) { _ + _ }
res2: Int = 49995000

也有其他并行收集操作可用。请注意 fold必须采用关联运算符-在上面的示例中,加法是关联的((A + B)+ C == A +(B + C)),即,您可以按任意顺序添加数字的子序列,并且您将始终获得相同的总和( reduce具有相似的约定)。

要注意的另一件事是,传递给并行集合的闭包是同时调用的。如果它们具有副作用,例如在环境中修改局部变量,则必须同步这些访问。例如,您可以执行以下操作:
scala> var a = 0                                                                                                                                                                 
a: Int = 0

scala> pa foreach { a += _ }

scala> a
res1: Int = 49995000

scala> a = 0
a: Int = 0

scala> pa foreach { a += _ }

scala> a
res7: Int = 49990086

每次都有不同的结果,因为 foreach并行调用 { a += _ }。在上面的示例中,应使 a同步,并使用锁或原子进行保护。

但是想法是使用内置的组合器来完成任务并倾向于功能编程,避免如上例所示的局部副作用。

您可能想在其他答案中提供的链接中阅读有关它们内部机制的更多信息。

关于QtConcurrent的Scala类似物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com