Scala-在多个线程中完成工作的最佳API

s

在Python中,我正在使用一个名为的库futures,该使我能够以简洁明了的方式对N个工作进程池进行处理:

schedulerQ = []
for ... in ...:
    workParam = ...  # arguments for call to processingFunction(workParam)
    schedulerQ.append(workParam)
with futures.ProcessPoolExecutor(max_workers=5) as executor:  # 5 CPUs
    for retValue in executor.map(processingFunction, schedulerQ):
        print "Received result", retValue

(这processingFunction是受CPU限制的,因此这里没有异步机制的意义-这是关于简单的旧算术计算的)

我现在正在寻找在Scala中执行相同操作的最接近的方法。请注意,在Python中,为避免GIL问题,我使用了进程(因此使用了ProcessPoolExecutor代替ThreadPoolExecutor),并且库自动将workParam要执行的每个进程实例参数编组processingFunction(workParam)在一起,然后将结果编组回主进程,对于执行程序的map循环消耗。

这适用于Scala和JVM吗?原则上,我的processingFunction也可以从线程执行(根本没有全局状态)-但是我很想看到多处理和多线程的解决方案。

问题的关键部分是JVM的世界中是否存在与futures您上面看到的Python一样清晰的API ...我认为这是我见过的最好的SMP API之一-准备一个列表使用所有调用的函数参数,然后只有两行:创建poolExecutor和map处理函数,在工作人员产生结果后立即取回它们。第一次调用return时,结果就开始出现,processingFunction一直持续到结果完成为止-此时for循环结束。

雷克斯·克尔

与在Scala中使用并行集合相比,您拥有的样板更少。

myParameters.par.map(x => f(x))

如果您想要默认的线程数(与内核数相同),将可以解决问题。

如果您坚持要设置工人数,则可以这样:

import scala.collection.parallel._
import scala.concurrent.forkjoin._

val temp = myParameters.par
temp.tasksupport = new ForkJoinTaskSupport(new ForkJoinPool(5))
temp.map(x => f(x))

返回时间的确切细节有所不同,但是您可以根据需要放入任意数量的设备f(x)(例如,对结果进行计算并执行某些操作),因此这可以满足您的需求。

通常,仅使结果显示为完成是不够的。然后,您需要对其进行处理,也许是对它们进行分叉,收集它们,等等。如果您通常希望这样做,那么Akka Streams(从此处开始的后续链接)将接近1.0,这将有助于生成复杂的并行处理图。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

辅助模式在Scala中完成什么工作?

来自分类Dev

辅助模式在Scala中完成什么工作?

来自分类Dev

printf 在 Scala 中如何工作?

来自分类Dev

完成“ Scala记录”示例

来自分类Dev

Scala中的多个选项值

来自分类Dev

在Scala中处理多个期货

来自分类Dev

在Scala中处理多个期货

来自分类Dev

Scala中的多个常量分配

来自分类Dev

Scala线程池-同时调用API

来自分类Dev

Scala备忘:此Scala备忘如何工作?

来自分类Dev

在 IntelliJ 中工作的 Scala 代码在 Scala 的 REPL 中失败

来自分类Dev

Scala Future完成后进行清理的最佳实践

来自分类Dev

scala折叠如何工作?

来自分类Dev

Scala的Vector如何工作?

来自分类Dev

在Scala中实现“ zipLongest”的最佳方法

来自分类Dev

在Scala中实现“ zipLongest”的最佳方法

来自分类Dev

Scala - 多线程,当任何子线程完成时完成主线程

来自分类Dev

Scala @引发多个异常

来自分类Dev

使用多个Scala期货

来自分类Dev

Scala中的有趣线程行为

来自分类Dev

Scala:在Scala中使用Java中的多个构造函数

来自分类Dev

Scala中的类型类API

来自分类Dev

使用Scala中的列表在Scala中排队

来自分类Dev

在Scala程序中查找Scala库的位置

来自分类Dev

测试API REST SCALA

来自分类Dev

Scala中序列中的多个期货

来自分类Dev

<:<运算符在Scala中如何工作?

来自分类Dev

在Scala工作表中打印期货结果

来自分类Dev

函数平等在Scala中如何工作?