Scala Futures 和多线程
Scala Futures and Multithreading
我是 Scala 的新手,我正在尝试掌握 futures 和多线程
我有一个程序的单线程版本,可以对矩阵进行一些计算
SingleThreadCalc {
def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = Future{doMath(matrix)}
}
我现在想要的是做一个多线程的版本。
只传递一个带有多个线程的 ExecutionContext 就足够了吗?
MultiThreadCalc {
def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] =
Future{doMath(matrix)} (ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)))
这会在所有线程之间分担计算负载还是根本不会发生?
简答:否
长答案:
object MultiThreadCalc {
def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] =
Future{doMath(matrix)}(ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)))
}
上面的代码,对于run
的每一次调用,都会分配一个新的线程池,这个线程池永远不会被关闭,它会被用来执行一个单一的方法doMath
(所以将仅使用该池中的 1 个线程。
现在,如果您想并行执行 doMath
本身,那么您需要将 ts 定义修改为可并行化,可能通过使其采用 implicit ec: ExecutionContext
参数并在其中使用该参数它的定义。
但是,如果您希望能够并行 运行 多次调用 doMath
,那么您可以执行以下操作:
object MultiThreadCalc {
def run(matrix : Seq[Seq[Double]])(implicit ec: ExecutionContext) : Future[Seq[Seq[Double]] = Future{doMath(matrix)}
}
然后在 "outside" 上可能 ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
创建一个 ExecutionContext 并在您想要在其上执行逻辑时使用它。
我是 Scala 的新手,我正在尝试掌握 futures 和多线程
我有一个程序的单线程版本,可以对矩阵进行一些计算
SingleThreadCalc {
def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = Future{doMath(matrix)}
}
我现在想要的是做一个多线程的版本。 只传递一个带有多个线程的 ExecutionContext 就足够了吗?
MultiThreadCalc {
def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] =
Future{doMath(matrix)} (ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)))
这会在所有线程之间分担计算负载还是根本不会发生?
简答:否
长答案:
object MultiThreadCalc {
def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] =
Future{doMath(matrix)}(ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)))
}
上面的代码,对于run
的每一次调用,都会分配一个新的线程池,这个线程池永远不会被关闭,它会被用来执行一个单一的方法doMath
(所以将仅使用该池中的 1 个线程。
现在,如果您想并行执行 doMath
本身,那么您需要将 ts 定义修改为可并行化,可能通过使其采用 implicit ec: ExecutionContext
参数并在其中使用该参数它的定义。
但是,如果您希望能够并行 运行 多次调用 doMath
,那么您可以执行以下操作:
object MultiThreadCalc {
def run(matrix : Seq[Seq[Double]])(implicit ec: ExecutionContext) : Future[Seq[Seq[Double]] = Future{doMath(matrix)}
}
然后在 "outside" 上可能 ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
创建一个 ExecutionContext 并在您想要在其上执行逻辑时使用它。