所以我已经完成了关于Scala的coursera课程,并亲自做了一个小的POC,展示了scala的多处理器功能。
我正在考虑创建一个非常小的示例,其中应用程序可以启动多个任务(每个任务将执行一些与网络相关的查询等(,并且我也可以显示多个内核的用法。此外,还会有一个线程将侦听机器的特定端口,并根据它在那里接收的信息生成任务。
关于如何处理此类问题的任何建议?我现在不想使用 AKKA。
并行集合可能是在 Scala 中使用多个处理器的最少努力的方式。它自然会导致如何最好地组织代码和数据以利用并行操作,更重要的是什么不会变得更快。
作为一个更具体的问题,假设您已经读取了CSV文件(或XML文档,或其他文件(并希望解析数据。如果记录已拆分为集合(如 List[String]
(,则可以执行.par
以创建并行列表,然后后续.map
将尽可能使用所有内核。生成的List[whatever]
将保留相同的顺序,即使操作未按顺序执行也是如此。考虑对每行上的值求和:
val in: List[String] = ...
val out = in.par.map { line =>
val cols = line split ','
cols.map(_.toInt).sum
}
因此,List("1,2,3", "4,5,6")
的in
将导致List(6, 15)
out
,就像没有.par
一样。 但它将跨多个内核运行。它是否更快是另一回事,因为使用并行集合会产生开销,这可能会使像这样的微不足道的示例变慢。您需要进行试验,看看并行集合在哪些方面对您的用例有利。
在 http://docs.scala-lang.org/overviews/parallel-collections/overview.html
睡眠理发师问题呢?您可以通过网络以分布式方式实现它,理发师的生成服务在一个端口上侦听,客户通过网络生成并请求理发师服务。
我认为这将是足够广泛和有趣的,但并非不可能。
然后,您可以在此基础上根据需要扩展它,例如为不同的事情(剪发或剃须(添加专门的理发师,然后从那里向下。天空(或者,更好的是,线程的上限(是极限!