【发布时间】:2016-08-02 05:18:13
【问题描述】:
我参加了Parallel Programming的课程,它显示了并行接口:
def parallel[A, B](taskA: => A, taskB: => B): (A, B) = {
val ta = taskA
val tb = task {taskB}
(ta, tb.join())
}
以下是错误的:
def parallel[A, B](taskA: => A, taskB: => B): (A, B) = {
val ta = taskB
val tb = task {taskB}.join()
(ta, tb)
}
在https://gist.github.com/ChenZhongPu/fe389d30626626294306264a148bd2aa查看更多界面
它还向我们展示了执行四个任务的正确方法:
def parallel[A, B, C, D](taskA: => A, taskB: => B, taskC: => C, taskD: => D): (A, B, C, D) = {
val ta = task { taskA }
val tb = task { taskB }
val tc = task { taskC }
val td = taskD
(ta.join(), tb.join(), tc.join(), td)
}
我的问题:如果我不知道提前完成的任务数量(任务列表),如何正确调用每个任务的join?
tasks.map(_.join()) // wrong
编辑
【问题讨论】:
-
注意:
map返回一个新集合,其中每个元素都由函数转换。也许您需要转换而不创建新集合? -
@jwvh 怎么办?
-
既然你不打算返回任何东西,那么就使用
foreach怎么样? -
@sebszyller 使用
foreach也将按顺序执行这些任务,而不是并行执行。 -
@chenzhongpu 我的意思是加入他们而不是实际执行。
标签: scala concurrency parallel-processing