【问题标题】:Scala Parallel Processing斯卡拉并行处理
【发布时间】:2018-03-01 22:20:40
【问题描述】:

我正在编写一个代码,该代码将从元数据存储库中获取数据库表列表,并按照元数据存储库中的配置在源数据库和目标数据库之间移动数据。以下是我的要求:-

  1. 并行处理列表中的每个表,并在源和目标之间移动数据。
  2. 生成将通过电子邮件发送的报告,其中包含有关哪些表已成功移动以及哪些表已失败的信息。

以下是代码的示例实现。方法futureCalc 将实现移动数据。以下是我的问题:-

1.对于发送电子邮件报告,我是否需要使用Async.result 作为阻止会话来获取报告列表,或者是否有非阻止的方式来实现这一点?

2.我在多个论坛上读到应该使用回调而不是阻塞 API,回调是在与主线程不同的线程中异步调用的吗?

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.Success
import scala.util.Failure
import scala.async.Async._

object test extends App {
  def futureCalc(i:Int):Int = {
    val sleeptime = i*60
    println("This is start of thread:"+i)
    Thread.sleep(sleeptime)
    println("This is after sleep :"+i)
    if (i<4)
      i*i
    else
      throw new RuntimeException("Bad thing")
  }

  val iniList   = List(1,2,3,4)
  val resultList = iniList map (i => Future{futureCalc(i)})

  resultList map  (i => {while(!i.isCompleted){
    i.onComplete {
      case Success(j) => println("No Issues")
      case Failure(ex) => println("Something went wrong ")
    }
  }
  }
    )

}

【问题讨论】:

    标签: scala


    【解决方案1】:

    如果您说 Scala 和数据库,请使用 Lightbend 的 SLICK。结果是可以像这样执行的期货:

    val q2 = for {
      c <- coffees if c.price < 9.0
      s <- suppliers if s.id === c.supID
    } yield (c.name, s.name)`
    

    请参阅 Slick 文档。

    【讨论】:

    • 感谢@Epicurist,但我想在一个表列表上运行一组任务,因此我正在创建一个期货列表并并行执行期货列表并最终收集结果。
    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 2012-08-24
    • 2016-04-27
    • 1970-01-01
    • 2021-12-07
    • 2011-09-16
    • 2016-01-31
    • 2017-10-23
    相关资源
    最近更新 更多